2013-09-07 12 views

Odpowiedz

5

Sztuką szukasz to może użyć do.call która pozwala wywołać funkcję i podać argumenty w postaci listy:

wrapperfX <- function(x){ 
    dots<-if(missing(x)){ 
    list() 
    }else{ 
    list(x=x) 
    } 
    do.call(targetf,dots) 
} 

To pozwala określić nazwanych argumentów, jak również wtedy, gdy elementy listy mają nazwy .

> do.call(log,list(x=10,base=10)) 
[1] 1 

jest równoważna

log(x=10,base=10) 

Jeśli funkcja dzwonisz jest wyrażona w kategoriach dot-dot-kropki, następnie argumenty będą mi dopasowane w taki sam sposób, jak gdybyś umieścić ich w wywołaniu funkcji.

[też miałeś brakujący nawias w, odpowiednio, missing((x){ :)]

+0

To działa doskonale. Ponieważ funkcje owijki powinny być bardzo szybkie, zastanawiam się, jak bardzo ten haker jest nieefektywny; Wywołania funkcji są stosunkowo drogie w konstrukcji listy R + również nie są za darmo ... –

2

Jeśli funkcja zależy od unevaluated wypowiedzi na , może chcesz używać substitute, aby uniknąć ocenę ... połączeń wewnątrz obwoluta.

Przykład:

f <- function(...) deparse(as.list(substitute(list(...)))[-1L]) 

wrap <- function(x){ 
    L <- if(missing(x)) list() else list(x) 
    do.call(f, L) 
} 

wrap2 <- function(x){ 
    L <- if(missing(x)) list() else list(substitute(x)) 
    do.call(f, L) 
} 

Uwaga jak wrap2 nie "dotknąć" argumenty:

f(1+2+3)  # "list(1 + 2 + 3)" 
wrap(1+2+3) # "list(6)" 
wrap2(1+2+3) # "list(1 + 2 + 3)" 

przypadku pustych rozmów, są one nie do odróżnienia:

f()  # "list()" 
wrap() # "list()" 
wrap2() # "list()" 
+0

Dobrze wiedzieć. Dziękuję Ci. –

Powiązane problemy