当写操作设一些表达j上的data.table,.SD不包含表中的所有列,而是只表达式使用的人.这适用于运行但不适合调试.查看所有列的最佳方法是什么?我可以传递所有的名字,.SDcols但这似乎相当乏味.例如:
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
Run Code Online (Sandbox Code Playgroud)
要使所有.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
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为,如此处所述
[.data.table()[...]预览未评估的j表达式,并仅添加到其中引用的.SD列.如果提到.SD本身,它会添加所有DT的列.
或者,如果您不希望.SD为每个分组计算支付加载列的费用,您始终可以x通过调用检查当前加载的子集x[.I,].(.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
Run Code Online (Sandbox Code Playgroud)