6

当编写一些j在 a 上操作的表达式时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
4

1 回答 1

7

要使所有.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

这是有效的,因为如此处所述

[.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
于 2013-05-15T18:31:00.570 回答