2012-07-06 52 views
24

有沒有辦法阻止data.table在通過引用分配新列後打印新的data.table?我收集的標準行爲是如何在v1.8.3之前的R {data.table}中使用`:=`時抑制輸出?

library(data.table) 
example(data.table) 
DT 
# x y v 
# 1: a 1 42 
# 2: a 3 42 
# 3: a 6 42 
# 4: b 1 11 
# 5: b 3 11 
# 6: b 6 11 
# 7: c 1 7 
# 8: c 3 8 
# 9: c 6 9 

DT[,z:=1:nrow(DT)] 

# x y v z 
# 1: a 1 42 1 
# 2: a 3 42 2 
# 3: a 6 42 3 
# 4: b 1 11 4 
# 5: b 3 11 5 
# 6: b 6 11 6 
# 7: c 1 7 7 
# 8: c 3 8 8 
# 9: c 6 9 9 

即分配後將表格打印到屏幕上。有沒有辦法阻止data.table在分配新列z之後顯示新表?我知道我可以說

DT <- copy(DT[,z:=1:nrow(DT)]) 

停止這種行爲,但被擊敗的:=目的(其目的是避免副本)。

回答

25

由於<-.data.table不進行復印,就可以使用<-

創建data.table對象:

library(data.table) 
di <- data.table(iris) 

創建一個新的列:

di <- di[, z:=1:nrow(di)] 
di 

#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species z 
# [1,]   5.1   3.5   1.4   0.2 setosa 1 
# [2,]   4.9   3.0   1.4   0.2 setosa 2 
# [3,]   4.7   3.2   1.3   0.2 setosa 3 
# [4,]   4.6   3.1   1.5   0.2 setosa 4 
# [5,]   5.0   3.6   1.4   0.2 setosa 5 
# [6,]   5.4   3.9   1.7   0.4 setosa 6 
# [7,]   4.6   3.4   1.4   0.3 setosa 7 
# [8,]   5.0   3.4   1.5   0.2 setosa 8 
# [9,]   4.4   2.9   1.4   0.2 setosa 9 
# [10,]   4.9   3.1   1.5   0.1 setosa 10 
# First 10 rows of 150 printed. 

還值得記住的是,R僅在交互中打印對象的值e模式。

因此,在批處理模式下,你可以簡單地使用:

di[, z:=1:nrow(di)] 

當在批處理模式的腳本運行時,這不會產生任何輸出。

從馬修Dowle

進一步信息:

另請參見常見問題解答2.21和2.22:

2.21爲什麼DT[i,col:=value]返回整個DT?我預計要麼沒有可見的值(與<-一致),要麼包含包含更新行數的消息或返回值。數據確實已被參考更新並不明顯。

使複合語法可以工作;例如,DT[i,done:=TRUE][,sum(done)]。當詳細信息打開時,可以根據每個查詢或全局使用options(datatable.verbose=TRUE)返回更新的行數。

2.22好的,但不能返回DT[i,col:=value]返回值不可見,那麼?

  • 我們試圖但R內部強制對[的可見性。FunTab的評估欄(參見src/main /因此,當我們直接嘗試 invisible()或設置R_Visible0時,eval在 src/main/eval.c會強制重新啓動它。
  • 習慣了這種行爲後,您可能會越來越喜歡它(我們有)。畢竟,我們使用<-分配了多少次,然後立即查看數據以檢查它是否正常?
  • 我們可以將:=混合成一個j,它也返回數據;混合更新並在一個查詢中選擇。要檢測j是否單獨更新(然後表現不正常)可能會造成混淆。
從馬修Dowle

二更新:

現在我們已經找到了解決辦法和v1.8.3不再打印出結果時,使用:=。我們將更新FAQ 2.21和2.22。

+0

謝謝!在這種情況下,我會使用'<-'。 – 2012-07-06 09:44:51

+2

+10我沒有想過嘗試'DT <-DT [i,col:= value]'。變量名稱的重複不是很好,但有效。這給了我一個想法如何讓'DT [i,col:= value]'不可見地返回:現在被提升爲[FR#2128](https://r-forge.r-project.org/tracker/index。 php?func = detail&aid = 2128&group_id = 240&atid = 978),謝謝! – 2012-07-06 10:32:51

+0

+1爲強大的聰明hack + FAQ中有趣的片段。 – 2012-07-06 12:58:52