为了调试 data.table 中的 j,我更喜欢使用 by 交互式检查结果 - browser() - dt´s。 SO 2013 解决了这个问题,我知道必须在 j 中调用 .SD 才能评估所有列。我用的是Rstudio,使用的是SO 2013方法,有两个问题:

  • 环境 Pane 未更新以反射(reflect)浏览器环境
  • 我经常遇到以下错误msg



  • 我可以通过这样做来解决这个问题:
    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/

    10-12 22:49