Netlogo 添加到列表列表

Netlogo adding to list of lists

我希望将补丁变量值添加到空列表列表中。补丁分为不同的区域,我正在尝试查看某些补丁变量如何因区域而异。 我有一个空列表列表(实际上包含 12 个列表,但为了简单起见):

set mylist [[] [] [] []]

以及对应不同区域的列表:

set zone-list [1 2 3 4]

以下是我尝试构建列表的方式:

(foreach mylist zone-list [set ?1 lput (sum-zone-variable ?2) ?1])

to-report sum-zone-variable [ n ]
  report (sum [patch-variable] of patches with [zone = n])
end

当我运行这个时,mylist 保持为空(即不变)。我认为问题出在 foreach 语句上,但我不知道它是什么。有帮助吗?

你的基本方法是好的,除了你必须分配一个名字。例如,

globals [mylist zone-list n-zones]

patches-own [zone zone-variable]

to setup
  set n-zones 4
  set zone-list n-values n-zones [?]
  ask patches [set zone one-of zone-list]
  set mylist n-values n-zones [[]]
end

to go
  ask patches [set zone-variable random-float 1]
  foreach zone-list [
    let total sum [zone-variable] of patches with [zone = ?]
    let oldvals item ? mylist
    set mylist replace-item ? mylist (lput total oldvals)
  ]
end

但是,您可能希望为此使用 table 扩展。

我可以理解 foreach mylist [ set ?1 ... ] 背后的想法,但 NetLogo 不是那样工作的。 set ?1 ... 对原始列表没有影响。 NetLogo 列表是不可变的,并且 ?1 不是对列表中可更新位置的引用——它只是一个临时变量,值已复制到其中。所以set ?1 ...是你基本不会写的

如果我没有正确理解你的问题,这里的相关原语是map。这应该可以完成工作:

set mylist (map [lput (sum-zone-variable ?2) ?1] mylist zonelist)