当编写一些在 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
最佳答案
使所有.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()
[...] previews the unevaluated j expression, and only adds to .SD columns that are referenced therein. If .SD itself is mentioned, it adds all of DT's columns.
或者,如果您不想承担加载费用
.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
关于r - R中data.table中的.SD列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16572463/