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

问题描述

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

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

Simple R code

Execution

因此,似乎“手动”, 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))