2010-08-05 7 views
28

Sono confuso dall'uso dei puntini di sospensione (...) in alcune funzioni, ad esempio come passare un oggetto contenente gli argomenti come un singolo argomento.Disimballaggio degli elenchi di argomenti per i puntini di sospensione in R

In Python viene chiamato "elenco di argomenti di disimballaggio", ad es.

>>> range(3, 6)    # normal call with separate arguments 
[3, 4, 5] 
>>> args = [3, 6] 
>>> range(*args)   # call with arguments unpacked from a list 
[3, 4, 5] 

In R, per esempio si ha la funzione di file.path(...) che utilizza i puntini di sospensione. Mi piacerebbe avere questo comportamento:

> args <- c('baz', 'foob') 
> file.path('/foo/bar/', args) 
[1] 'foo/bar/baz/foob' 

Invece, ottengo

[1] 'foo/bar/baz' 'foo/bar/foob' 

dove gli elementi della args non sono "spacchettato" e valutate allo stesso tempo. Esiste un R equivalente a Python *arg?

risposta

30

la sintassi non è bello, ma questo fa il trucco:

do.call(file.path,as.list(c("/foo/bar",args))) 

do.call accetta due argomenti: una funzione e un elenco di argomenti per chiamare tale funzione con.

+0

Grazie, l'ha fatto. – mhermans

+0

Una discussione estesa su questa tecnica: https://www.r-bloggers.com/a-new-r-trick-for-me-at-least/ – Alex

17

È possibile estrarre le informazioni dai puntini di sospensione chiamando lo list(...) all'interno della funzione. In questo caso, le informazioni nell'ellissi sono raggruppate come oggetto elenco. Per esempio:

> foo <- function(x,...){ 
+ print(list(...)) 
+ } 
> foo(1:10,bar = 'bar','foobar') 
$bar 
[1] "bar" 

[[2]] 
[1] "foobar" 

è possibile ottenere il comportamento desiderato dalle funzioni Vectorised come file.path con una chiamata a do.call, che a volte è più semplice da usare con il wrapper splat (nel pacchetto plyr)

> args <- c('baz', 'foob') 
> library(plyr) 
> splat(file.path)(c('/foo/bar', args)) 
[1] "/foo/bar/baz/foob" 
+0

Grazie (non può ancora suvedere). – mhermans