我需要在NetLogo中使用R扩展来进行一些网络计算。我在NetLogo中创建网络,将其导出到文本文件,让R读取文本文件并构建图形并计算属性,然后获取计算结果。 NetLogo通过R扩展名控制导出,读取,计算和获取。
但是,NetLogo和R具有不同的默认工作目录。我在更改R中的目录时断开与扩展的连接(参见R extension breaks connection to extensions directory in NetLogo)的问题正在影响我在模型上使用BehaviorSpace的尝试。
我的新方法是不更改R工作目录,而只是提供导出文件的R的完整路径。
r:clear
let dir pathdir:get-model
r:eval "library(igraph)"
; read network in R (avoid bug of R change working directory)
let runstring (word "r:eval \"gg <- read_graph(file = \"" dir "\\netlogo.gml\", format = \"gml\")\"")
print runstring
run runstring
这将生成正确的字符串,从print语句输出:
r:eval "gg <- read_graph(file = "C:\Users\Jen\Desktop\Intervention Effect\netlogo.gml", format = "gml")"
但我run runstring
this nonstandard character is not allowed
收到错误。通过直接将我构造的字符串放入run
命令进行调试,我意识到这是因为我现在处于字符串环境中并且必须逃避(&#39; \&#39;)我的所有反斜杠和引号。也就是说,如果直接键入或包含在NetLogo代码中,该命令将起作用,如果将其作为要运行的字符串提供,则该命令将不起作用。
我还没有能够构建一个字符串来放入有效的行run runstring
,甚至可以手工制作。这意味着我不知道我想要创建的字符串是什么样的。识别出适当的目标字符串后,我需要代码来获取变量&#39; dir&#39;,将其转换为字符串,将各种\字符添加到目录,将其他各种\字符添加到引号中命令,并加入它以便它运行。
任何人都可以提供一些内容以帮助我进一步发展吗?
仍在努力解决这个问题
我现在正试图倒退。找到一个有效的字符串,然后创建它。
如果我按如下方式对run
命令进行硬编码,NetLogo将关闭。即使我在引号之间复制文本并将其直接输入R,它也可以达到预期的效果。
let Rstring "gg <- read_graph(file = 'C:\\Users\\Jen\\Desktop\\Intervention Effect\\Networks\\netlogo.gml', format = 'gml')"
r:eval Rstring
答案 0 :(得分:2)
使用NetLogo的PathDir扩展名来更改默认的NetLogo目录是另一种选择吗?您可以在https://github.com/cstaelin/Pathdir-Extension/releases查看。它还有一些用于构建路径名的工具。
查尔斯
答案 1 :(得分:1)
pathdir
选项最终正常运行。以下是将来遇到类似问题的任何人的示例代码。
let filename (word "Networks/netlogo" behaviorspace-run-number ".gml")
export-simple-gml filename
r:clearLocal
let dir pathdir:get-model
set filename (word dir "/" filename)
r:put "fn" filename
r:eval "gg <- read_graph(file = fn, format = 'gml')"
r:eval "V(gg)$name <- V(gg)$id" ; gml uses 'id', but igraph uses 'name'
我有一个单独的实际导出过程,它构造了一个简化的gml文件,因为igraph
格式文件的gml
导入有些瘫痪。这是上面代码中调用的过程,相关部分是:
to export-simple-gml [ FN ]
carefully [ file-close-all ] [ ]
carefully [ file-delete FN ] [ ]
file-open FN
file-print <line to write to file>
...
end