r - 强制评估 data.table 中的 .SD

标签 r data.table lazy-evaluation

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

  1. 环境 Pane 未更新以反射(reflect)浏览器环境
  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 不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/

相关文章:

r - 模型使用 glm 但不是 bigglm

r - mosaic 包中不再有 fetchData 函数

r - 将大型数据集加载到 R 中的最快方法和最快格式是什么

clojure - 在累加器上进行归约和映射会产生堆栈溢出

string - 我应该如何从 clojure 中的惰性序列创建一个字符串?

r - 从 R 中的经纬度点获取国家(和大陆)

r - 使用 dplyr 和 data.table 按组区分

r - 在 data.table r 中使用 seq 时出错

php - 对 PHP 中任何闭包的惰性求值

r - 使用 spplot 在 R 的 for 循环中绘图