R咖喱怪异
R Curry weirdness
我发现库 (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)
}
在这种情况下调用
f[[1]](0)
returns 11. 我预计 2.
有 2 个修复对我来说没有任何意义 - 一个是使循环变平,如
fns <- list()
fns[[1]] <- Curry(Curry(f,1),1)
fns[[2]] <- Curry(Curry(f,2),2)
...
行得通。此外,在原始循环中放置单个函数求值是可行的——如
fns <- list()
foreach(i=c(1:10)) %do% {
f[[i]] <- Curry(Curry(f,i),i)
f[[i]](27)
}
然后我们有
f[[1]](0) = 2.
怎么回事?
在没有依赖项的情况下重述问题
我假设 Curry
是 defined 因为
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
显示 f
的第一个参数直到循环完成后才被计算。
分析
这是由于惰性求值。
这里的罪魁祸首比 Explain a lazy evaluation quirk 更微妙一些,这就是为什么我在标记为重复项时犹豫不决。
这里延迟的是对FUN
的评价
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
我发现库 (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)
}
在这种情况下调用
f[[1]](0)
returns 11. 我预计 2.
有 2 个修复对我来说没有任何意义 - 一个是使循环变平,如
fns <- list()
fns[[1]] <- Curry(Curry(f,1),1)
fns[[2]] <- Curry(Curry(f,2),2)
...
行得通。此外,在原始循环中放置单个函数求值是可行的——如
fns <- list()
foreach(i=c(1:10)) %do% {
f[[i]] <- Curry(Curry(f,i),i)
f[[i]](27)
}
然后我们有
f[[1]](0) = 2.
怎么回事?
在没有依赖项的情况下重述问题
我假设 Curry
是 defined 因为
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
显示 f
的第一个参数直到循环完成后才被计算。
分析
这是由于惰性求值。
这里的罪魁祸首比 Explain a lazy evaluation quirk 更微妙一些,这就是为什么我在标记为重复项时犹豫不决。
这里延迟的是对FUN
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