sapply(a, replica, b) 表达式在函数内不再起作用

Col*_*los 0 r function replicate sapply

这是我第一次在这里发帖。当我遇到错误(或错误)时,我通常会寻找替代方案,但是,由于我将在 R 中走得更远更深入,所以我很高兴了解正在发生的事情。

我做了一个简单的例子来重现错误:

简单的 R 代码

执行

因此,似乎“手动”, sapply(a,replicate,b) 确实有效。但是,函数内的该表达式会返回错误。我在网上搜索了大约 1 小时,但没有找到类似的东西。

我感谢你的时间,

G. *_*eck 6

问题指出,即使下面的第一行成功,下面的最后一行失败并出现错误,但唯一的区别是基本上同一行在函数内。

sapply(2, replicate, 3)
##      [,1]
## [1,]    3
## [2,]    3

doRep <- function(a, b) sapply(a, replicate, b)
doRep(3, 2)
## Error in FUN(X[[i]], ...) : object 'b' not found
Run Code Online (Sandbox Code Playgroud)

非标准评价

问题是replicate使用非标准评估的第二个参数

replicate <- function (n, expr, simplify = "array") {
  sapply(integer(n), eval.parent(substitute(function(...) expr)), 
    simplify = simplify)
}
Run Code Online (Sandbox Code Playgroud)

using eval.parentwhich 指的是 的调用者replicate;但是,没有找到replicateis的调用者sapply, not doRepso bin doRep(a, b)

这可能会出错的另一个例子是:

sapply(2, replicate, str(FUN))
## function (n, expr, simplify = "array")  <--- Note
## function (n, expr, simplify = "array")  
##      [,1]
## [1,] NULL
## [2,] NULL
Run Code Online (Sandbox Code Playgroud)

显然它相匹配的FUN内部争论sapply,在这种情况下是作为传递replicate

args(replicate)
## function (n, expr, simplify = "array") 
Run Code Online (Sandbox Code Playgroud)

复制2

如果我们添加一个envir参数replicate,然后传递正确的环境来查找 b 那么它将起作用:

replicate2 <- function (n, expr, simplify = "array", envir = parent.frame()) {
  sapply(integer(n), eval(substitute(function(...) expr), envir), 
    simplify = simplify)
}
doRep2 <- function(a, b) sapply(a, replicate2, b, envir = environment())
doRep2(3, 2)
##      [,1]
## [1,]    2
## [2,]    2
## [3,]    2
Run Code Online (Sandbox Code Playgroud)