如何读取文件,运行模拟,然后读取下一个文件并重复模拟

时间:2019-03-05 18:05:19

标签: netlogo

对于下面的代码,我试图依次读取在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来一次执行一些模拟该怎么办?有没有一种有效的方法来实现此目的?

1 个答案:

答案 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

使用这样的小部件:

enter image description here

还有这样的实验:

enter image description here

要获得这样的输出:

enter image description here

这表明每次运行都生成了一个不同的filename