2017-08-21 54 views
0

我是R的新手,并考虑在我的NetLogo工作中使用它。 Jan Thiele的NetLogo R扩展的一个有用示例是datafile-example.netlogo。它的第三个功能说明了当一列包含向量时将数据帧保存为文件时要执行的操作:使用I()将该列标记为类AsIs。这里是基于该例子的代码。读取带有矢量列的R数据帧(由NetLogo存储)

crt 30 [ set xcor random-xcor 
     set ycor random-ycor 
     set test (list random 10 random 20 random 30 random 40) ] 
(r:putagentdf "ag" turtles "who" "xcor" "ycor" "test") 
r:eval "ag$test <- I(ag$test)" 
r:eval (word "write.table(ag , sep=';', file='" path "')") 

没有为读书没有例如数据返回到R,我想不出如何做到这一点。

数据帧的列的单元是数值向量在R.

> str(Glob) 
'data.frame': 30 obs. of 4 variables: 
$ who : num 0 1 2 3 4 5 6 7 8 9 ... 
$ xcor: num -3.201 -11.507 -9.045 -0.242 4.161 ... 
$ ycor: num 2.82 3.86 -5.14 -8.45 8.96 ... 
$ test:List of 30 
..$ : num 2 6 29 1 
..$ : num 6 3 17 17 
<snip> 

但是它们被保存该文件作为矢量文本输入英寸以上两个因此是c(2, 6, 29, 1)c(6, 3, 17, 17)

迄今为止,如图上面和下面的代码,我已经添加了sepstringsAsFactors选项(并且也没能成功使用colClasses)。

r:eval (word "ag <- read.table(file='" path "', sep=';', stringsAsFactors=FALSE)") 

现在该列的单元格是字符串。

> str(agGlob) 
'data.frame': 30 obs. of 4 variables: 
$ who : int 0 1 2 3 4 5 6 7 8 9 ... 
$ xcor: num -3.201 -11.507 -9.045 -0.242 4.161 ... 
$ ycor: num 2.82 3.86 -5.14 -8.45 8.96 ... 
$ test: chr "c(2, 6, 29, 1)" "c(6, 3, 17, 17)" "c(3, 18, 25, 34)" "c(8, 5, 3, 7)" ... 

因此,问题仍然存在:如何将这些数据读回R.第二步将返回到NetLogo。也许没有必要将它读入R? (然后为什么从R中保存它)

对于第二步,有一系列专门的命令r:put...,但是除了命令vanilla r:get之外没有其他任何东西。虽然这可能进一步表明我在这里缺少某些东西,但看起来r:get在列表上做了一些复杂的转换,但在其描述中也没有提到向量。

回答

1

这是一个体面的答案,虽然在扩展功能的打算使用中仍然可能会丢失一些东西。

除了sep=';'(在write.tableread.table)和stringsAsFactors=FALSE选项,一些后处理是必要的:

let t r:get "lapply(ag$test, function(x) eval(parse(text=x)))" 

至少我学到了一点R.

+0

做得好的搞清楚。我的两个美分 - 你的问题“那么为什么要从R保存?”我也会问。我认为您使用的“数据文件示例”主要演示如何在完成您所需的任务后输出分析/结果/数据。我期望通常你会在R环境中完成你的工作,而不是写入文件,再次加载等。 –

+0

True;我期待着学习RNetLogo。我们还留下了第二级问题:为什么要将矢量作为数据框中的元素存储?再一次,我感觉答案是,我仍然很早就使用R作为NetLogo的一部分。 – Chris