iç çevreyi belirtmek do.call aşağıdakifonksiyonu
## 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
, bir paket içinde inşa ama sadece fonksiyonları bir ise işe yaramaz gerçeğiyle Isırılmışsın farklı (yerel) çerçeve,
## 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"
Ben envir=parent.frame(2)
do.call()
için (çalışmıyor) geçen denedim; Açıkçası, ?parent.frame
yardım sayfasının başım ağrıyor. Daha sağlam bir do.call kullanımı için herhangi bir ipucu?
İşlevler listesinin, başka bir kod parçasından geçirilen bir karakter vektörü olarak geldiğini unutmayın; Fonksiyonları doğrudan geçmemeyi tercih ederim.
Düzenleme: bir daha büküm ... benim oyuncak örnekle sağ sorunu resimli sanıyordum ama kullanıyorum gerçek kod ben içinde fun_wrap1
arıyorum anlamda biraz farklıdır Ayrı bir işlev. Önerilen çözümler bu bağlamda başarısız.
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"
(ve aynı match.fun
yaklaşımla olur)
Ben fun_wrap1
için isteğe bağlı ortam geçirerek işe alabilirsiniz
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()
ve bu umutla bu kadar.
Sürekli değişiklikler hakkında üzgünüm, ilk yinelemeyi yazdığımda hedefi doğru bir şekilde tanımlayamadım. – baptiste
Düzeltilen örneğinizde başarısız olursa, yeni işlev şu şekilde değiştirilmelidir: 'fun_wrap1 <- işlev (funs, envir = parent.frame()) { lapply (funs, do.call, args = list (x = 3) , envir = envir) } 'foo' işlevi olduğu gibi kalabilir. –
Teşekkürler, tavsiyenize göre değiştirdim. – baptiste