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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage