list - texto - puntos suspensivos ejemplos
Desempaquetando listas de argumentos para puntos suspensivos en R (2)
La sintaxis no es tan hermosa, pero esto hace el truco:
do.call(file.path,as.list(c("/foo/bar",args)))
do.call
toma dos argumentos: una función y una lista de argumentos para llamar a esa función con.
Estoy confundido por el uso de puntos suspensivos ( ...
) en algunas funciones, es decir, cómo pasar un objeto que contiene los argumentos como un solo argumento.
En Python se llama "desempaquetar listas de argumentos", por ejemplo
>>> 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]
En R, por ejemplo, tiene la función file.path(...)
que usa puntos suspensivos. Me gustaría tener este comportamiento:
> args <- c(''baz'', ''foob'')
> file.path(''/foo/bar/'', args)
[1] ''foo/bar/baz/foob''
En cambio, me sale
[1] ''foo/bar/baz'' ''foo/bar/foob''
donde los elementos de args
no se "desempaquetan" y se evalúan al mismo tiempo. ¿Hay una R equivalente a Pythons *arg
?
Puede extraer información de los puntos suspensivos al llamar a la list(...)
dentro de la función. En este caso, la información en los puntos suspensivos se empaqueta como un objeto de lista. Por ejemplo:
> foo <- function(x,...){
+ print(list(...))
+ }
> foo(1:10,bar = ''bar'',''foobar'')
$bar
[1] "bar"
[[2]]
[1] "foobar"
Puede lograr el comportamiento deseado de las funciones vectorizadas como file.path
con una llamada a do.call
, que a veces es más fácil de usar con el paquete de plyr
(en el paquete plyr
)
> args <- c(''baz'', ''foob'')
> library(plyr)
> splat(file.path)(c(''/foo/bar'', args))
[1] "/foo/bar/baz/foob"