问题描述
这是我第一次在这里发帖。当我遇到错误(或错误)时,我通常会寻找替代方案,但是,由于我将在 R 中走得更远更深入,所以我很高兴了解正在发生的事情。
因此,似乎“手动”, sapply(a,replicate,b) 确实有效。但是,函数内的该表达式会返回错误。 我在网上搜索了大约 1 小时,但没有找到类似的内容。
感谢您抽出宝贵时间
解决方法
问题
问题指出,即使下面的第一行成功,下面的最后一行也失败并出现错误,但唯一的区别是基本上同一行在函数内。
sapply(2,replicate,3)
## [,1]
## [1,] 3
## [2,] 3
doRep <- function(a,b) sapply(a,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)
}
使用 eval.parent
指代 replicate
的调用者;但是,replicate
的调用者是 sapply
,而不是 doRep
,因此在 b
中找不到 doRep(a,b)
。
另一个可能出错的例子是:
sapply(2,str(FUN))
## function (n,simplify = "array") <--- Note
## function (n,simplify = "array")
## [,] NULL
## [2,] NULL
显然它匹配 FUN
中的 sapply
参数,在本例中作为 replicate
传递:
args(replicate)
## function (n,simplify = "array")
复制2
如果我们向 envir
添加一个 replicate
参数,然后传递正确的环境来查找 b 那么它会起作用:
replicate2 <- function (n,simplify = "array",envir = parent.frame()) {
sapply(integer(n),eval(substitute(function(...) expr),envir),simplify = simplify)
}
doRep2 <- function(a,replicate2,b,envir = environment())
doRep2(3,2)
## [,] 2
## [2,] 2
## [3,] 2
,
您可以通过创建一个本地函数来解决此限制,您可以在其中以正常方式传递参数 b
:
function(a,function(x) replicate(x,b))