2011-06-27 26 views
12

He estado teniendo dificultades para encontrar información sobre cómo pasar una lista a una función en R.¿Cómo pasar una lista a una función en R?

He utilizado este enfoque antes, p.

plot(list(x=1,y=1)) 

pero el siguiente ejemplo me da un error:

foo <- function(a, b) c <- a + b 
foo(list(a=1,b=1)) 

Error in foo(list(a = 1, b = 1)) : 
    argument "b" is missing, with no default 

Además, ?function no funciona y help('function') no proporciona información sobre cómo pasar de una lista a una función.

actualización

Para aclarar, entiendo cómo puedo utilizar una lista como un solo argumento, pero yo estaba confundido porque estaba bajo la impresión de que una propiedad de las funciones es que varios argumentos podrían pasar como una lista. Parece que esta impresión fue incorrecta. Por el contrario, muchas funciones están escritas específicamente para manejar listas, como se describe en los comentarios y respuestas a continuación.

+0

Usted está de paso un solo argumento a su función que espera 2. La llamada correcta sería: foo (a = lista (1), b = lista (2)). Si desea pasar a su función una lista única, debe declararla como función (a) y luego llamarla de la misma manera que lo hizo. La lógica de función también está desactivada, ya que no puede agregar argumentos no numéricos de esa manera y tendrá que indexar sus listas dentro del cuerpo de su función para lograr lo que desea (adivinar aquí), es decir, un [[1]] + b [[1]]. – diliop

+1

No lo he investigado, pero supongo que 'plot' tiene un método que maneja listas. Para hacer algo similar con 'foo', necesitaría hacerlo genérico y escribir los métodos apropiados. –

+0

@Joshua, gracias por la aclaración. Tenía la impresión de que se podía aprobar una lista sin un manejo especial. –

Respuesta

23

Uso do.call

foo <- function(a, b) a + b 

do.call(foo, list(a=1,b=1)) 

Alternativamente se puede hacer

foo <- function(l) l$a + l$b 

foo(list(a=1,b=1)) 
+1

gracias. La función 'do.call' es genial! –

5

Su función tiene dos argumentos, pero sólo se le pasa una, de ahí el error.

Puede modificar el código de este modo:

foo <- function(a) c <- a[[1]] + a[[2]] 
foo(list(a=1,b=1)) 
Cuestiones relacionadas