2013-05-15 9 views
6

data.tableにあるjで動作する式を書くとき、.SDには表のすべての列が含まれず、式が使用する列のみが含まれます。これは実行するには問題ありませんが、デバッグには最適ではありません。すべての列を表示する最良の方法は何ですか?私は.SDcolsにすべての名前を渡すことができますが、これはかなり面倒なようです。例:.SD列のdata.tableがR

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表現でそれを参照する必要があります。たとえば、これを試してみてください。as explained here

[.data.table()は[...]未評価のjの表現をプレビューし、その中でのみ参照されている列を.SDする追加し、これは動作します

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 

。 .SD自体が記述されている場合、DTのすべての列が追加されます。あなたは、各バイグループ計算のためのロード.SDの列の費用を負担したくない場合は


あるいは、あなたは常に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

クール、私が望んでいたまさに:(.Iは、現在のグループのxの行の位置を格納する変数です)。ありがとう – Alex

関連する問題