对于下面的代码,我试图依次读取在r中创建的.txt文件,并将其输出到我的工作目录(包含Netlogo和R脚本)到NetLogo。这些文件实质上是ascii网格文件,其编号已分配给补丁,以根据文本文件中网格单元格中的编号为补丁着色,从而生成风景。 NetLogo代码通过一个简单的“设置”按钮执行此操作。
patches-own [
landcover
]
to setup ; procedure to reset netlogo interface once setup button is pressed after one run of various code procedures
ca ; clears the world
resize-world 0 600 -600 0
generate-landscape
reset-ticks
end
to generate-landscape
file-open "landscape.txt"
foreach sort patches [
the-patch ->
ask the-patch [ ; read a data element into a patch variable
set landcover file-read ; color the patch accordingly
if (landcover = 1) [
set pcolor green
]
if (landcover = 0.5) [
set pcolor orange
]
if (landcover = 0) [
set pcolor grey
]
]
]
file-close
end
我的问题是,如果我在工作目录中有多个诸如ascii grid .txt的文件,每个文件代表一个新的/不同的风景,并且我想将它们读入NetLogo来一次执行一些模拟该怎么办?有没有一种有效的方法来实现此目的?
答案 0 :(得分:1)
如果您有一个通用文件名(例如“ terrain1.asc”,“ terrain2.asc”等),则可以使用最简单的foreach
进行遍历。否则,您可以使用r
扩展名,如下所示:
extensions [r csv]
globals [ list-of-file-names ]
to setup
ca
r:eval "x <- list.files('absolute_folder_path_here')"
set list-of-file-names r:get "x"
reset-ticks
end
to go
foreach list-of-file-names [
fname ->
let fpath word "absolute_folder_path_here" fname
print csv:from-file fpath
]
end
在上面的示例中,我在一个文件夹中有三个不同的.csv文件。我向R中调用的list.files
函数提供了该文件夹的绝对地址,以获取保存为列表的文件名列表,然后可以使用foreach
遍历每个文件并执行所需的任何操作。
extensions [r csv]
globals [
list-of-file-names
numbers
]
to setup
ca
r:eval "x <- list.files('C:/Users/lukepc/Google Drive/school_2017/nlogo_examples/textfiles')"
set list-of-file-names r:get "x"
reset-ticks
end
to scheduler
foreach list-of-file-names [
fname ->
; Reset the world
limited-reset
; Load the new file/data
let fpath word "C:/Users/lukepc/Google Drive/school_2017/nlogo_examples/textfiles/" fname
set numbers csv:from-file fpath
; Do your model procedures
go
]
end
to limited-reset
; Reset all variables (except list-of-file-names) here
; and otherwise return your model to its base state
end
to go
; Do the regular model processes as normal
end
修改:
从布莱恩·海德(Brian Head)那里偷东西-如果他提出这个答案,我将撤出我的土地!
如果要使用BehaviorSpace,假设使用简单的命名约定,这会容易得多,则可以执行以下设置:
扩展名[r csv]
globals [
list-of-file-names
filename
]
to setup
ca
set filename ( word "landscape" n ".txt" )
reset-ticks
end
使用这样的小部件:
还有这样的实验:
要获得这样的输出:
这表明每次运行都生成了一个不同的filename
。