强制在data.table中评估 .SD

3
为了在data.table中调试j,我更喜欢使用browser()与-by- dt交互式地检查结果。 SO 2013 解决了这个问题,我理解必须在j中调用.SD才能评估所有列。 我使用Rstudio,并使用SO 2013的方法,但出现了两个问题:
  1. 环境面板没有更新以反映浏览器环境。
  2. 我经常遇到以下错误信息:
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)]
1个回答

3
据我所知,data.table需要在传递给j的代码中明确地看到.SD,否则它甚至不会在为执行创建的环境中公开它。例如,请参见此问题及其评论
为什么不创建一个不断在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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接