2017-08-21 55 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