我使用指定的環境下構建一個包,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