R 咖喱怪诞
我看到库(roxygen)中的Curry函数有奇怪的行为。下面是一个简单的例子:R 咖喱怪诞,r,currying,roxygen2,roxygen,R,Currying,Roxygen2,Roxygen,我看到库(roxygen)中的Curry函数有奇怪的行为。下面是一个简单的例子: library(roxygen) library(foreach) f <- function(x,y,z) { return(x+y+z) } fns <- list() foreach(i=c(1:10)) %do% { f[[i]] <- Curry(Curry(f,i),i) } 返回11。我希望是2 有两个修复对我来说没有任何意义-一个是使循环变平,如中所示 fns <
library(roxygen)
library(foreach)
f <- function(x,y,z) { return(x+y+z) }
fns <- list()
foreach(i=c(1:10)) %do% {
f[[i]] <- Curry(Curry(f,i),i)
}
返回11。我希望是2
有两个修复对我来说没有任何意义-一个是使循环变平,如中所示
fns <- list()
fns[[1]] <- Curry(Curry(f,1),1)
fns[[2]] <- Curry(Curry(f,2),2)
...
发生了什么?在没有依赖项的情况下重新启动问题
我想咖喱是
显示直到循环完成后才计算f
的第一个参数
分析
这是由于懒惰的评估
这里的罪魁祸首有点微妙,这就是为什么我在标记为复制品时含糊其辞的原因
这里延迟的是对FUN
CurryF<-function(FUN,...) {
force(FUN); #needed for nesting Curry
dots<-list(...);
function(...) do.call(FUN,c(dots,list(...)))}
我想这就够了。因此,懒惰的评估怪癖不是罪魁祸首-特别是,我将看到我在2.8和3.2中解释的行为(我目前无法检查)?更正-它是懒惰的评估/绑定。所以我不应该在3.2中看到这种行为。
fns <- list()
foreach(i=c(1:10)) %do% {
f[[i]] <- Curry(Curry(f,i),i)
f[[i]](27)
}
f[[1]](0) = 2.
Curry<-function(FUN,...) {
dots<-list(...);
function(...) do.call(FUN,c(dots,list(...)))}
f <- function(x,y,z) list(x,y,z)
fns<-vector("list",10)
for(i in 1:10) {fns[[i]]<-Curry(Curry(c,i),i)}
fns[[1]](0)
[1] 10 1 0
CurryF<-function(FUN,...) {
force(FUN); #needed for nesting Curry
dots<-list(...);
function(...) do.call(FUN,c(dots,list(...)))}
for(i in 1:10) {fns[[i]]<-CurryF(CurryF(c,i),i)}
fns[[1]](0)
[1] 1 1 0