Я использую следующие конструкции в пакете,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?
Обратите внимание, что список функций поступает как вектор символов, переданный из другого фрагмента кода; Я предпочитаю не передавать функции напрямую.
Edit: еще один поворот ... Я думал, что я проиллюстрировал правильно проблему с моей игрушкой, например, но фактический код, я использую немного отличается, в том смысле, что я звоню 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
В вашем пересмотренном примере, который терпит неудачу, новая функция должна быть изменена на: 'fun_wrap1 <- function (funs, envir = parent.frame()) { lapply (funs, do.call, args = list (x = 3) , envir = envir) } 'Функция' foo' может оставаться такой, какая есть. –
Спасибо, я изменил его в соответствии с вашим советом. – baptiste