为了调试 data.table 中的 j
,我更喜欢使用 by
交互式检查结果 - browser()
- dt´s。 SO 2013 解决了这个问题,我知道必须在 j
中调用 .SD 才能评估所有列。我用的是Rstudio,使用的是SO 2013方法,有两个问题:
我可以通过这样做来解决这个问题:
f <- function(sd=force(.SD),.env = parent.frame(n = 1)) {
by = .env$.BY;
i = .env$.I;
sd = .env$.SD;
grp = .env$.GRP;
N = .env$.N;
browser()
}
library (data.table)
setDT(copy(mtcars))[,f(.SD),by=.(gear)]
但是 - 在
data.table
保持简短和甜蜜的精神 - 我可以以某种方式强制(force
中的 f
不起作用)在对 f
的调用中评估 .SD 以便最终代码可以运行:setDT(copy(mtcars))[,f(),by=.(gear)]
最佳答案
我所知道的,data.table
需要在传递给 .SD
的代码中的某处显式地看到 j
,
否则它甚至不会在它为执行创建的环境中公开它。
参见例如 this question and its comments 。
为什么不创建一个不同的辅助函数,它总是在 .SD
中指定 j
?
就像是:
dt_debugger <- function(dt, ...) {
f <- function(..., .caller_env = parent.frame()) {
by <- .caller_env$.BY;
i <- .caller_env$.I;
sd <- .caller_env$.SD;
grp <- .caller_env$.GRP;
N <- .caller_env$.N;
browser()
}
dt[..., j = f(.SD)]
}
dt_debugger(as.data.table(mtcars), by = .(gear))
关于r - 强制对 data.table 中的 .SD 进行评估,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57535685/