为了调试 data.table 中的 j
,我更喜欢使用 browser()
交互式检查生成的 -by
- dt . SO 2013解决了这个问题,我知道必须在 j
中调用 .SD 才能评估所有列。我使用 Rstudio 并使用 SO 2013方法,有两个问题:
- 环境 Pane 未更新以反射(reflect)浏览器环境
- 我经常遇到以下错误信息
Error: option error has NULL value In addition: Warning message: In get(object, envir = currentEnv, inherits = TRUE) : restarting interrupted promise evaluation
我可以通过以下方式解决这个问题:
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
的精神,让事情变得简短而甜蜜 - 我能以某种方式强制(f
中的 force
不work) 在对 f
的调用中对 .SD 的评估,以便最终代码可以运行:
setDT(copy(mtcars))[,f(),by=.(gear)]
最佳答案
据我所知,
data.table
需要在传递给 j
的代码中的某处明确看到 .SD
,
否则它甚至不会将它暴露在它为执行创建的环境中。
参见示例 this question and its comments .
为什么不创建一个始终在 j
中指定 .SD
的不同辅助函数?
像这样的东西:
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/