NetLogo R 扩展
NetLogo 的 R-Extension 提供了在 NetLogo 模型中使用统计软件 R (Gnu S)(参见 R 项目网站 )的原语。有一些原语可以使用来自 NetLogo 变量或代理的值创建 R-Variables 和其他原语来评估 R 中有或没有返回值的命令。
使用
要在模型中使用扩展,请在程序选项卡顶部添加一行:
extensions [ r ]
如果您的模型已经使用其他扩展,那么它已经有
extensions
一行,所以只需添加
r
到列表中即可。
有关使用 NetLogo 扩展的更多信息,请参阅 扩展指南 。
有关 R-Extension 的使用示例,可以 从项目存储库 下载模型。这些模型与 NetLogo 一起安装在 R 扩展的“models”目录中。请注意(自 NetLogo 6.0 起)这些模型 不 包含在 NetLogo 模型库中。
一些技巧
绘图
如果要使用 R 的绘图功能,可以通过 r:setPlotDevice 激活 JavaGD 绘图设备,参见“plot-example1.nlogo”模型。这是首选方法!
但是您也可以使用标准的 R 设备,但是,您必须给 R 一些 cpu 时间,例如,通过
sys.sleep(0.01)
使用永久按钮运行评估。参见“plot-example2.nlogo”。(非常感谢 Thomas Petzold!)。也可以将绘图创建到文件中。请参阅示例文件夹中的“plot-into-file-example.nlogo”。
从/向文件加载和保存数据
可以直接在 R 中从文件加载和保存数据。此代码片段说明:
r:eval "dataname <- read.table('<path to file>')" ; read file
r:eval "write.table(dataname, file='<filename>')" ; write file
单元格中带有向量的 Data.frame
通常,一个 data.frame 单元格只包含一个值。每列都表示为一个向量,如果您将向量的向量放入 data.frame,它将被分成几列。使用 R-Extension,当您将 NetLogo 列表分配给包含每一行的嵌套 NetLogo 列表的列时,可以将向量放入 data.frame 单元格中。例如,如果您想要在此 data.frame 上使用 write.table,则必须将此列标记为
class="AsIs"
。您可以使用
I(x)
-function 来执行此操作。
示例:如果感兴趣的列的名称为“col1”,您可以执行 data.frame “df1”
r:eval "df1$col1 <- I(df1$col1)"
。
help(I)
从 R 终端内调用以获取更多详细信息。
加载 R 脚本
此外,您可以在 R 脚本中定义函数、加载它并使用这些函数。通过加载 R 文件
r:eval "source('<path to r-file>')"
。
加载包
也可以通过加载 R 包
r:eval "library(<name of package>)"
。
当您编译包含的代码时,
extensions [r]
您将创建一个新的 R 工作区。在您重新加载扩展、打开新模型或提交原语之前
[r:clear](#rclear)
,在此会话中分配的所有 R 变量都将可用,就像您从命令行或 R 控制台中使用 R 一样。
交互式外壳
您可以通过打开交互式 R Shell
r:interactiveShell
。这个 shell 是底层 R 实例的端口。此 shell 适用于全局环境(请参阅下面
R 扩展中的环境
),而扩展本身适用于自定义本地环境。但是全局环境中有一个自动变量“nl.env”,它是对扩展本地环境的引用。不要删除这个变量!例如,
您可以通过 访问由扩展程序创建的变量。如果您想从 Interactive Shell 绘图,您应该使用包含的 JavaGD 绘图设备(请参阅
r:setPlotDevice
)。您可以通过鼠标右键上下文菜单保存和加载输入的 R 命令的历史记录。
get("<variable name>",nl.env)myvar <- get("myvar",nl.env)
请阅读打开外壳后输出文本区域顶部的注释!在 Linux 操作系统上,您可能会看到来自 X11 的错误消息。请检查是否一切正常。如果是这样,您可以忽略这些消息。如果没有,请将报告发送至 bugs@ccl.northwestern.edu 或 打开一个问题 。
R 扩展中的环境
当您加载模型时,R-Extension 会创建一个新的 R 环境。当您使用 R-Extension 创建 R 变量时,该变量是在本地 R 环境中创建的。此外,来自 R-Extension 的所有调用都在这个本地环境中工作。这个新的环境概念使您能够在 BehaviorSpace Experiments 中使用扩展。因此,当您不使用交互式 Shell 或其他适用于全局环境的工具时,您不必关心环境。
<-
您可以通过使用运算符或通过执行来显式地将变量分配给全局环境
assign(<name>,<value>,envir=.GlobalEnv)
。如果您使用交互式 Shell,请在打开 Shell 后查看输出文本区域顶部的注释。
输入
help(environment)
R shell 以了解有关环境的更多信息。
您可以/应该通过清除(即删除所有变量和空闲内存)本地环境
r:clearLocal
。如果您还想清除全局环境(整个工作区),请调用
r:clear
.
记忆
使用 R-Extension,您可以将 R 加载到 NetLogo 的进程中。由于 R 的体系结构,两个软件共享一个系统进程,因此分配给 NetLogo 的内存。
在某些情况下,由于 Java 的堆空间,您可能会收到内存不足错误。您可以在启动 NetLogo 之前通过调整
-Xmx
JVM 参数来增加堆空间(另请参阅
NetLogo 手册中有关 Windows 内存的部分
)。但在 32 位系统上,这是非常有限的。因此,如果您想要/需要使用大量 RAM,最好使用 64 位系统。您可以通过启动交互式 shell (
r:interactiveShell
) 并在其中键入:
memory.size(max=F)
和来查看 R 的内存使用情况
memory.size(max=T)
。此外,您可以通过键入以下内容来检查内存限制:
memory.limit()
。
也可以看看:
- memory.profile 的 R 手册页
- object.size 的 R 手册页
- memory.size 的 R 手册页
如果您通过键入 gc() 在交互式 shell 中调用垃圾收集器,您将获得有关当前内存使用情况的一些信息(另请参见 http://stat.ethz.ch/R-manual/R-patched/library/base /html/gc.html )。
如果您键入
gc(nl.env)
,您将看到用于 cons 单元格和向量的内存百分比。
不要忘记
r:gc
在删除 R 变量后调用原语,也不要忘记删除不再需要的 R 变量!查看删除变量并调用 后内存使用情况如何变化
r:gc
。
如果你使用了太多的内存,NetLogo 可能会突然关闭。在这种情况下,请检查是否有减少内存使用的方法。如果没有,请尝试切换到
Rserve-extension
。使用 Rserve-Extension,NetLogo 和 R 两个软件都可以独立运行。当然,一个请求的可传输数据量也有限制,但限制较少。
关于本主题的最后一点:请记住,R 是一种面向向量的语言。尽可能防止使用单个值进行大量调用,并用向量操作替换它们。这更快更稳定。
无头
从 R-Extension 版本 1.1 开始,当 NetLogo 在无头模式下运行时,可以使用扩展。例如,当您从命令行运行 BehaviorSpace 实验时就是这种情况(参见
此处
)。不同之处在于,
interactiveShell
未初始化/实例化。您可以在 GUI 模式下使用您所知道的扩展,但无法打开 interactiveShell (
r:interactiveShell
) 和设置绘图设备 (
r:setPlotDevice
)。但是还需要做一件事:
r:stop
在无头运行 NetLogo 时必须调用 finally 来停止 R 引擎。否则 NetLogo 不会关闭,您也不会返回到命令行提示符。设置行为空间实验时,可以选择设置最终命令。这是添加的好地方
r:stop
命令。
安装中
R 扩展与 NetLogo 6 捆绑在一起。要使用它,您需要安装兼容的 R,并且可能需要配置扩展。
安装 R
标准 R 3 安装应该可以工作(有时无需配置)。从 NetLogo 6.0.2 开始,测试了以下操作系统/R 版本:
- Mac 操作系统,R 3.3.3
- 视窗 10,R 3.3.2
- Ubuntu 14.04(64 位),R 3.0.2
安装 R 后,您将需要安装
rJava
软件包。R 扩展的某些功能依赖于
JavaGD
包。
要安装,请从程序列表中启动 RGui,单击菜单栏中的“Packages”项,然后单击“Install Package(s)”。选择您最喜欢的服务器并在包列表中找到“rJava”,以及“JavaGD”和/或“CommonJavaJars”(两者都是可选的)。
如果您更喜欢使用控制台,则可以通过在控制台中运行以下命令来安装相同的包(并根据它们生成的提示进行操作)。
install.packages("rJava")
install.packages("JavaGD") # Optional