2013-09-07 17 views
5

ho trovato la soluzione per il passaggio di argomenti mancanti per le funzioni con valori predefiniti che utilizzano un tale codice pseudo:È possibile creare un ellisso (`...`) da zero?

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

Quanto sono queste cose ammessi in R?

risposta

5

Il trucco che stai cercando è forse da usare do.call che ti permette di chiamare una funzione e specificare gli argomenti come lista:

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

Questo consente di specificare argomenti con nome e se gli elementi della lista hanno nomi .

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

è equivalente a

log(x=10,base=10) 

Se la funzione che si sta chiamando è espressa in termini di punti-dot-dots, quindi gli argomenti saranno abbinati a me nello stesso modo come se ci si mette li nella chiamata di funzione.

[anche avuto una parentesi mancante in, in modo appropriato, missing((x){ :)]

+0

Funziona perfettamente. Poiché le funzioni del wrapper dovrebbero essere molto veloci, mi chiedo, quanto questo hackery sia inefficiente; le chiamate di funzione sono relativamente costose nella costruzione delle liste R + non è gratis ... –

2

Se la funzione dipende dal non valutata espressione, si può decidere di utilizzare substitute, al fine di evitare la valutazione delle ... chiamate all'interno della wrapper.

Esempio:

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) 
} 

Nota come wrap2 non "toccare" gli argomenti:

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

Per le chiamate vuote, sono indistinguibili:

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

È bello sapere. Grazie. –

Problemi correlati