我使用指定的环境下构建一个包,do.call内部功能
## 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()
,这就是希望它。
对于不断变化的抱歉,我在编写第一次迭代时未能正确识别目标。 – baptiste 2014-09-25 01:06:25
在您的修改失败的示例中,应将新函数更改为:fun_wrap1函数(funs,envir = parent.frame())lapply(funs,do.call,args = list(x = 3) ,envir = envir) }'foo'函数可以保持原样。 – 2014-09-25 01:13:23
谢谢,我根据你的建议改变了它。 – baptiste 2014-09-25 01:18:21