R 咖喱怪诞

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 <

我看到库(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 <- 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