问题指出,即使下面的第一行成功,下面的最后一行失败并出现错误,但唯一的区别是基本上同一行在函数内。
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)
如果我们添加一个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)
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |