2015-11-25 18 views
1

我正在尋找將修補程序變量值添加到空列表的列表。這些補丁分爲不同的區域,我試圖看看某些補丁變量是如何按區域不同的。 我有名單的空列表(實際上包含了12名名單,但爲了簡單起見):將Netlogo添加到列表中

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聲明,但我無法弄清楚它是什麼。任何幫助?

回答

2

我可以看到背後的思想foreach mylist [ set ?1 ... ],但NetLogo不能這樣工作。 set ?1 ...對原始列表沒有影響。 NetLogo列表是不可變的,並且?1不是對列表中的可更新位置的引用 - 它只是一個臨時變量,已將值複製到該變量中。所以set ?1 ...是你基本上永遠不會寫的東西。

如果我正確理解你的問題,這裏的相關原語是map。這應該做的工作:

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

您的解決方案工作!我還是比較新的,過去我只用過foreach,但是map是我正在尋找的東西。感謝您的輸入! (是的,我有我的原始代碼?1和?2,這是一個錯誤 - 我會編輯我原來的問題)。 – Stephen

1

您的基本方法是好的,除了您必須分配一個名稱。例如,

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 

但是,您可能希望使用表擴展名。