在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
答案 0 :(得分: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()
[...]预览未评估的j表达式,并仅添加到其中引用的.SD列。如果提到.SD本身,它会添加所有DT的列。
或者,如果您不希望为每个分组计算支付加载.SD
列的费用,您可以随时通过调用{{x
来检查当前加载的x[.I,]
子集。 1}}。 (.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