我正在使用 data.table 包返回函数闭包列表j
表达式作为输出approxfun
来自 stats 包的函数。基本上,在每个日期,我想要一个闭包,它允许我根据由下式确定的任意 xval 计算任意 yvalapproxfun
.
然而,approxfun
仅当至少有两个唯一的 x 值传递给函数时才有效。在 x 只有一个唯一值的情况下,我想返回一个返回 y 唯一值的函数。
在下面的代码中,我通过检查来执行此步骤.N
值并根据是否返回不同的函数.N
is > 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))
在上下文中评估函数“afun”时j
表达式,会打印“yval”的正确值。但是,当我事后返回评估第一个函数时,返回的 yval 是lastyval 在由“by”分组创建的组中,该函数不是由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 中缺少的东西?
先谢谢您的帮助