NetLogo 6.2如何调整文件导出数据?
How to adjust files to export data in NetLogo 6.2?
我正在尝试在 NetLogo 6.2 中导出文件。但是我有两个困难:
- 在输出中只输入 1 header。它只出现多个 header 或没有 header(见下图)
多个header个:
没有header:
我希望它看起来像这样(如下)。可能吗?
- 关闭文件以免多个结果写入同一个文件。当我使用“小心”和“file-delete”和“[]”命令时,只出现了一只乌龟的结果:
如果我删除命令“小心地”和“file-delete”和“[]”,所有海龟的结果都会出现。但是,如果我多次运行模型,结果将保存在最上面。如何在不改变结果的情况下关闭文件?
代码:
globals [ outifile ]
turtles-own [ my-xcor my-ycor my-timer ]
to output
; carefully ;; using this command to close the file only saves the path of the last turtle
; [ file-delete ( word outfile name ".csv" ) ] ;; using this command to close the file only saves the path of the last turtle
; [ ] ;; using this command to close the file only saves the path of the last turtle
file-open ( word outifile ".csv" )
file-print ( word "id;my_xcor;my_ycor;my_timer" ) ;; when removing this line, there is no header
file-print ( word self " ; " my-xcor " ; " my-ycor " ; " my-timer )
file-close
end
这两个问题的原因相同,解决方法相同。
第 1 点
这是因为显然 to output
由 每只海龟 执行,这意味着每只海龟将首先打印 headers 然后打印值。请注意,这正是您要求他们做的,让每只海龟执行以下两行代码:
file-print ( word "id;my_xcor;my_ycor;my_timer" )
file-print ( word self " ; " my-xcor " ; " my-ycor " ; " my-timer )
因此,在要求海龟做任何事情之前,你必须先打印 headers(即观察者是必须打印 headers,然后必须要求海龟做任何事情的人)打印值)。
对于第 2 点
这个问题也是因为你有 每只乌龟 执行整个 to output
过程。在这种情况下,这意味着每只乌龟都会 运行
carefully
[file-delete (word outfile name ".csv")]
[]
因此,每只乌龟在写入输出之前都会确保文件已被删除(或文件不存在)。
同样,这是观察者应该做的事情,因为它只需要做一次。
修复
要解决这些问题,您有两个完全等价的选择:
选项 1
保留 to output
一个 turtle-context 过程(即由海龟执行的过程)并将观察者的任务放在代码中的其他地方,您知道它们将被执行 仅一次 - 例如在setup
或某个等效位置:
to setup
; Here you have your normal 'setup' code, plus:
prepare-output
end
to prepare-output
carefully
[file-delete (word outfile name ".csv")]
[]
file-open (word outifile ".csv")
file-print (word "id;my_xcor;my_ycor;my_timer")
file-close
end
因此观察者将负责清理文件并创建 headers,当海龟 运行 to output
时,它们只需要打印它们的值。
选项 2
将 to output
从海龟执行的过程更改为观察者执行的过程。在这种情况下,在程序开始时,观察者将做一次它的观察者的事情,然后才要求所有海龟打印它们的值。海龟完成后,观察者关闭文件。例如:
to go
; Here you have your normal 'go' code, plus something like:
if (stop-condition-reached?) [
output
stop
]
end
to output
carefully
[file-delete (word outfile name ".csv")]
[]
file-open (word outifile ".csv")
file-print (word "id;my_xcor;my_ycor;my_timer")
ask turtles [
file-print (word self " ; " my-xcor " ; " my-ycor " ; " my-timer)
]
file-close
end
这两个选项背后的逻辑完全相同:观察者只做一次(删除旧文件并使用 headers 创建一个新文件),然后每只海龟打印其值。
这两个选项之间的区别仅在于代码的组织方式 - 即 to output
是由海龟执行的过程,还是由观察者(然后要求海龟打印)执行的过程?
一般来说,跟踪谁在执行什么很重要。
出于这个原因,在我的代码中,我总是用一条注释来注释每个过程的声明,说明从什么上下文执行这样的过程(例如观察者上下文、海龟上下文、补丁上下文、link 上下文)。
我正在尝试在 NetLogo 6.2 中导出文件。但是我有两个困难:
- 在输出中只输入 1 header。它只出现多个 header 或没有 header(见下图)
多个header个:
没有header:
我希望它看起来像这样(如下)。可能吗?
- 关闭文件以免多个结果写入同一个文件。当我使用“小心”和“file-delete”和“[]”命令时,只出现了一只乌龟的结果:
如果我删除命令“小心地”和“file-delete”和“[]”,所有海龟的结果都会出现。但是,如果我多次运行模型,结果将保存在最上面。如何在不改变结果的情况下关闭文件?
代码:
globals [ outifile ]
turtles-own [ my-xcor my-ycor my-timer ]
to output
; carefully ;; using this command to close the file only saves the path of the last turtle
; [ file-delete ( word outfile name ".csv" ) ] ;; using this command to close the file only saves the path of the last turtle
; [ ] ;; using this command to close the file only saves the path of the last turtle
file-open ( word outifile ".csv" )
file-print ( word "id;my_xcor;my_ycor;my_timer" ) ;; when removing this line, there is no header
file-print ( word self " ; " my-xcor " ; " my-ycor " ; " my-timer )
file-close
end
这两个问题的原因相同,解决方法相同。
第 1 点
这是因为显然 to output
由 每只海龟 执行,这意味着每只海龟将首先打印 headers 然后打印值。请注意,这正是您要求他们做的,让每只海龟执行以下两行代码:
file-print ( word "id;my_xcor;my_ycor;my_timer" )
file-print ( word self " ; " my-xcor " ; " my-ycor " ; " my-timer )
因此,在要求海龟做任何事情之前,你必须先打印 headers(即观察者是必须打印 headers,然后必须要求海龟做任何事情的人)打印值)。
对于第 2 点
这个问题也是因为你有 每只乌龟 执行整个 to output
过程。在这种情况下,这意味着每只乌龟都会 运行
carefully
[file-delete (word outfile name ".csv")]
[]
因此,每只乌龟在写入输出之前都会确保文件已被删除(或文件不存在)。
同样,这是观察者应该做的事情,因为它只需要做一次。
修复
要解决这些问题,您有两个完全等价的选择:
选项 1
保留 to output
一个 turtle-context 过程(即由海龟执行的过程)并将观察者的任务放在代码中的其他地方,您知道它们将被执行 仅一次 - 例如在setup
或某个等效位置:
to setup
; Here you have your normal 'setup' code, plus:
prepare-output
end
to prepare-output
carefully
[file-delete (word outfile name ".csv")]
[]
file-open (word outifile ".csv")
file-print (word "id;my_xcor;my_ycor;my_timer")
file-close
end
因此观察者将负责清理文件并创建 headers,当海龟 运行 to output
时,它们只需要打印它们的值。
选项 2
将 to output
从海龟执行的过程更改为观察者执行的过程。在这种情况下,在程序开始时,观察者将做一次它的观察者的事情,然后才要求所有海龟打印它们的值。海龟完成后,观察者关闭文件。例如:
to go
; Here you have your normal 'go' code, plus something like:
if (stop-condition-reached?) [
output
stop
]
end
to output
carefully
[file-delete (word outfile name ".csv")]
[]
file-open (word outifile ".csv")
file-print (word "id;my_xcor;my_ycor;my_timer")
ask turtles [
file-print (word self " ; " my-xcor " ; " my-ycor " ; " my-timer)
]
file-close
end
这两个选项背后的逻辑完全相同:观察者只做一次(删除旧文件并使用 headers 创建一个新文件),然后每只海龟打印其值。
这两个选项之间的区别仅在于代码的组织方式 - 即 to output
是由海龟执行的过程,还是由观察者(然后要求海龟打印)执行的过程?
一般来说,跟踪谁在执行什么很重要。 出于这个原因,在我的代码中,我总是用一条注释来注释每个过程的声明,说明从什么上下文执行这样的过程(例如观察者上下文、海龟上下文、补丁上下文、link 上下文)。