为了在data.table中调试j,我更喜欢使用
browser()
与-by- dt交互式地检查结果。 SO 2013 解决了这个问题,我理解必须在j中调用.SD才能评估所有列。 我使用Rstudio,并使用SO 2013的方法,但出现了两个问题:
- 环境面板没有更新以反映浏览器环境。
- 我经常遇到以下错误信息:
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
不起作用)在对f
的调用中评估 .SD,以便最终代码可以运行:
setDT(copy(mtcars))[,f(),by=.(gear)]