sapply(a,replica,b)表达式在函数内不再起作用
这是我第一次在这里发帖。当我遇到错误(或错误)时,我通常会寻找替代方案,但是,由于我将在 R 中走得更远更深入,所以我很高兴了解正在发生的事情。
我做了一个简单的例子来重现错误:
简单的 R 代码
执行
因此,似乎“手动”, sapply(a,replicate,b) 确实有效。但是,函数内的该表达式会返回错误。我在网上搜索了大约 1 小时,但没有找到类似的东西。
我感谢你的时间,
回答
题
问题指出,即使下面的第一行成功,下面的最后一行失败并出现错误,但唯一的区别是基本上同一行在函数内。
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
非标准评价
问题是replicate使用非标准评估的第二个参数
replicate <- function (n, expr, simplify = "array") {
sapply(integer(n), eval.parent(substitute(function(...) expr)),
simplify = simplify)
}
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
显然它相匹配的FUN内部争论sapply,在这种情况下是作为传递replicate:
args(replicate)
## function (n, expr, simplify = "array")
复制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