r - data.table 中闭包的处理

标签 r data.table closures

我使用 data.table 包返回 j 表达式中的函数闭包列表,作为 stats 包中 approxfun 函数的输出。基本上,在每个日期,我想要一个闭包,允许我根据由 approxfun 确定的任意 xval 计算任意 yval。

但是,approxfun 仅当至少有两个唯一的 x 值传递给函数时才有效。在 x 只有一个唯一值的情况下,我想返回一个返回 y 唯一值的函数。

在下面的代码中,我通过检查 .N 值并根据 .N 是否为 > 1 返回不同的函数来执行此步骤.

 library(data.table)
 set.seed(10)
 N <- 3
 x <- data.table(Date = Sys.Date() + rep(1:N, each = 3), xval = c(0, 30, 90), yval = rnorm(N * 3))
 x <- x[-c(2:3), ]

 ##interpolation happens correctly
 x2 <- x[order(Date, xval), {
     if(.N > 1){
         afun <- approxfun(xval, yval, rule = 1)
     }else{
         afun <- function(v) yval
     }
     print(afun(30))
     list(Date, afun = list(afun))
 }, by = Date]

 ##evaluation does NOT happen correctly, the val used is the last...
 sapply(x2[, afun], do.call, args = list(v = 30))

j 表达式的上下文中计算函数“afun”时,会打印“yval”的正确值。但是,当我事后返回评估第一个函数时,返回的 yval 是由“by”分组创建的组中的最后一个 yval,该函数不是由 创建的approxfun (由 approxfun 创建的所有闭包均按预期工作)。

我怀疑这与我在惰性评估中遗漏的东西有关。我使用“force”函数尝试了下面的附加代码,但没有成功。

 x3 <- x[order(Date, xval), {
      if(.N > 1){
         afun <- approxfun(xval, yval, rule = 1)
     }else{
         fn <- function(x){
             force(x)
             function(v) x
         }
         afun <- fn(yval)
     }
     print(afun(30))
     list(Date, afun = list(afun))
 }, by = Date]

 sapply(x3[, afun], do.call, args = list(v = 30))

还有其他人遇到过这个问题吗?是我在基本 R 中缺少的东西还是在 data.table 中缺少的东西?

提前感谢您的帮助

最佳答案

是的,典型的 data.table 引用与复制常见问题解答。这按预期工作:

x2 <- x[order(Date, xval), {
  if(.N > 1){
    afun <- approxfun(xval, yval, rule = 1)
  }else{
    fn <- function(){
      #ensure the value is copied
      x <- copy(yval)
      function(v) x
    }
    afun <- fn()
  }
  print(afun(30))
  list(Date, afun = list(afun))
}, by = Date]
#[1] 0.01874617
#[1] 0.2945451
#[1] -0.363676

sapply(x2[, afun], do.call, args = list(v = 30))
#[1]  0.01874617  0.29454513 -0.36367602

关于r - data.table 中闭包的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45736273/

相关文章:

r - data.table 中的大整数。 1.9.2 中的分组结果与 1.8.10 中的分组结果不同

scala - "Destructuring"Scala 闭包中的 Map.Entry

Javascript 闭包 : How to add dynamic baselayers to Cesium map

在 lapply(.SD,...) 中为 data.table R 保留列名

r - 错误 : arrange() failed at implicit mutate() step. x 无法为 `..1` 创建临时列

regex - 如何设置正则表达式以在 R 中使用 grep 或 dplyr 查找变量?

将具有 NA 的行删除到特定列和条件中

r - 比较同一数据框中组中的行

swift - 闭包的强引用循环?

r - 如何从存储在另一个数据框中的与测试记录最相似的数据集中找到记录?