2013-05-15 79 views
6

當編寫在data.table上運行j的某個表達式時,.SD不包含表中的所有列,而只包含表達式使用的列。這對於運行而言是很好的,但對於調試來說並不好。什麼是查看所有列的最佳方式?我可以通過所有的名字.SDcols,但這似乎相當單調。例如:.SD中的data.table中的列

x = data.table(a=1:10, b=10:1, id=1:5) 
x[,{ browser(); a+1},by=id] 
Called from: `[.data.table`(x, , { 
    browser() 
    a + 1 
}, by = id) 
Browse[1]> n 
debug at #1: a + 1 
Browse[1]> .SD 
    a 
1: 1 
2: 6 

回答

6

爲了讓所有可用.SD的欄目,你只需要在你的j表達的地方引用它。例如,試試這個:

x[,{.SD; browser(); a+1},by=id] 
# Called from: `[.data.table`(x, , { 
#  .SD 
#  browser() 
#  a + 1 
# }, by = id) 
Browse[1]> .SD 
# a b 
# 1: 1 10 
# 2: 6 5 

這樣做是因爲,as explained here

[.data.table() [...]預覽未計算Ĵ表達,只會增加.SD被引用其中列。如果.SD本身被提及,它會添加所有DT的列。


或者,如果你不想承擔裝載.SD的列的費用爲每逐組計算,你可以隨時通過調用x[.I,]檢查的x當前加載的子集。 (.I是存儲在當前組的x行位置的變量):

x[,{browser(); a+1},by=id] 
# Called from: `[.data.table`(x, , { 
#  browser() 
#  a + 1 
# }, by = id) 
Browse[1]> x[.I,] 
# a b id 
# 1: 1 10 1 
# 2: 6 5 1 
+0

涼,正是我想要的。謝謝 – Alex

相關問題