do.call Umgebung innerhalb von function @ angeb
Ich verwende das folgende Konstrukt in einem Paket,
## 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
aber ich bin nur gebissen von der Tatsache, dass es nicht funktioniert, wenn sich die Funktionen in einem anderen (lokalen) Frame befinden,
## 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"
Ich habe versucht vorbeienvir=parent.frame(2)
zudo.call()
(funktioniert nicht); ehrlich gesagt die Hilfeseite von?parent.frame
geht mir weit über den Kopf. Jeder Hinweis auf eine robustere Verwendung von do.call
Beachten Sie, dass die Liste der Funktionen als Zeichenvektor vorliegt, der von einem anderen Codeteil übergeben wurde. Ich ziehe es vor, die Funktionen nicht direkt zu übergeben.
Bearbeiten noch eine Wendung ... Ich dachte, ich hätte das richtige Problem mit meinem Spielzeugbeispiel veranschaulicht, aber der tatsächliche Code, den ich verwende, unterscheidet sich geringfügig in dem Sinne, dass ich @ aufruffun_wrap1
innerhalb einer separaten Funktion. Die vorgeschlagenen Lösungen schlagen in diesem Zusammenhang fehl.
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"
(und das gleiche passiert mit demmatch.fun
Ansatz
Ich kann es zum Laufen bringen, indem ich eine optionale Umgebung an @ übergebfun_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()
und das ist es hoffentlich.