我在一个包中使用以下构造,
## two functions in the global environment
funa <- function(x) x^2
funb <- function(x) x^3
## called within a function, fine
fun_wrap <- function(){
lapply(c('funa', 'funb'), do.call, list(x=3))
}
fun_wrap()
[[1]]
[1] 9
[[2]]
[1] 27但我只是被这样的事实咬了一口:如果函数是在不同的(本地)框架内,它就不能工作,
## same construct, but the functions are local
fun_wrap1 <- function(){
funa1 <- function(x) x^2
funb1 <- function(x) x^3
lapply(c('funa1', 'funb1'), do.call, list(x=3))
}
## now it fails
fun_wrap1()
##Error in FUN(c("funa1", "funb1")[[1L]], ...) :
## could not find function "funa1"我尝试过将envir=parent.frame(2)传递给do.call() (不起作用);坦率地说,?parent.frame的帮助页面超出了我的权限。有什么提示可以更有力地使用do.call吗?
注意,函数列表是从另一段代码中传递的字符向量;我不喜欢直接传递函数。
编辑:再转一圈.我以为我的玩具示例说明了正确的问题,但我使用的实际代码略有不同,因为我是在一个单独的函数中调用fun_wrap1。在这方面,拟议的解决办法失败了。
fun_wrap1 <- function(funs){
lapply(funs, do.call, args=list(x=3), envir=environment())
}
foo <- function(){
funa1 <- function(x) x^2
funb1 <- function(x) x^3
fun_wrap1(c('funa1', 'funb1'))
}
foo()
##Error in FUN(c("funa1", "funb1")[[1L]], ...) :
## could not find function "funa1"( match.fun方法也是如此)
我可以通过向fun_wrap1传递一个可选环境来使其工作,
fun_wrap1 <- function(funs, e=parent.frame()){
lapply(funs, do.call, args=list(x=3), envir=e)
}
foo <- function(){
funa1 <- function(x) x^2
funb1 <- function(x) x^3
fun_wrap1(c('funa1', 'funb1'))
}
foo()希望就是这样。
发布于 2014-09-25 00:43:34
这似乎是可行的,但我不确定它是否有其他的含义,我没有考虑:
fun_wrap1 <- function(){
funa1 <- function(x) x^2
funb1 <- function(x) x^3
lapply(c('funa1', 'funb1'), do.call, args=list(x=3), envir=environment())
}
fun_wrap1()
#[[1]]
#[1] 9
#
#[[2]]
#[1] 27因此,这在本质上等同于将lapply语句设置为:
lapply(
c('funa1', 'funb1'),
function(f) do.call(f, args=list(x=3), envir=environment() )
) 发布于 2014-09-25 00:32:14
显然,如果我们在fun_wrap2中评估这些函数,它就能工作。问题中的方法的问题是字符串被转换成一个处理函数中的函数,这改变了查找路径。
fun_wrap2 <- function(){
funa1 <- function(x) x^2
funb1 <- function(x) x^3
nms <- c("funa1", "funb1")
funs <- lapply(nms, match.fun)
lapply(funs, do.call, list(x=3))
}
fun_wrap2()发布于 2014-09-25 00:36:11
一个稍微简单一些的@g-格罗特迪克的答案。我们没有使用函数名,而是将函数本身放入输入给lapply的列表中。
fun_wrap1 <- function(){
funa1 <- function(x) x^2
funb1 <- function(x) x^3
lapply(list(funa1, funb1), do.call, list(x=3))
}
fun_wrap1()https://stackoverflow.com/questions/26028488
复制相似问题