pasando varios argumentos a FUN de lapply (y otros * aplican)

99

Tengo una pregunta sobre cómo pasar múltiples argumentos a una función, cuando uso lapplyin R.

Cuando uso lapply con la sintaxis de lapply(input, myfun);, esto es fácilmente comprensible y puedo definir myfun así:

myfun <- function(x) {
 # doing something here with x
}

lapply(input, myfun);

y los elementos de inputse pasan como xargumento a myfun.

Pero, ¿y si necesito pasar algunos argumentos más myfunc? Por ejemplo, se define así:

myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

¿Cómo puedo usar esta función pasando ambos inputelementos (como xargumento) y algún otro argumento?

Vasily A
fuente
1
Terminar las líneas de entrada de la consola R con ";" es una señal de que probablemente utilizó algún lenguaje de procesamiento de macros en el pasado. El argumento de los puntos triples se describe en la subsección 4 de la sección "Escribir sus propias funciones" del documento "Introducción a R", posiblemente el primer "Manual" que debería estar leyendo.
IRTFM

Respuestas:

122

Si busca la página de ayuda, uno de los argumentos lapplyes el misterio .... Cuando miramos la sección Argumentos de la página de ayuda, encontramos la siguiente línea:

...: optional arguments to ‘FUN’.

Entonces, todo lo que tiene que hacer es incluir su otro argumento en la lapplyllamada como un argumento, así:

lapply(input, myfun, arg1=6)

y lapply, reconociendo que arg1no es un argumento con el que sabe qué hacer, lo pasará automáticamente myfun. Todas las demás applyfunciones pueden hacer lo mismo.

Un apéndice: también puede usarlo ...cuando esté escribiendo sus propias funciones. Por ejemplo, digamos que escribe una función que llama ploten algún momento y desea poder cambiar los parámetros del gráfico desde su llamada a la función. Puede incluir cada parámetro como un argumento en su función, pero eso es molesto. En su lugar, puede usar ...(como un argumento tanto para su función como para la llamada a trazar dentro de ella), y hacer que cualquier argumento que su función no reconozca se transfiera automáticamente plot.

Jonathan Christensen
fuente
¿Qué pasa si su segundo argumento, por ejemplo, "arg1" es una lista que coincide con la lista de "entrada"? Cuando intento lapply (input, myfun, arg1 = input2) donde input2 es una lista, parece que lapply pasa la lista completa a la vez en lugar de elemento por elemento como con 'input'.
Alan
10
Acabo de encontrar una respuesta en otra publicación que funciona: mapply (myfun, df $ input, df $ input2)
Alan
18

Como sugirió Alan, la función 'mapply' aplica una función a múltiples listas múltiples o argumentos vectoriales:

mapply(myfun, arg1, arg2)

Consulte la página del manual: https://stat.ethz.ch/R-manual/R-devel/library/base/html/mapply.html

Andrés
fuente
Y vale la pena mencionarlo outeren la misma línea, que aplica una función a cada par de valores en dos argumentos vectoriales. Página de manual
ms609
11

Puedes hacerlo de la siguiente manera:

 myfxn <- function(var1,var2,var3){
      var1*var2*var3

    }

    lapply(1:3,myfxn,var2=2,var3=100)

y obtendrás la respuesta:

[[1]] [1] 200

[[2]] [1] 400

[[3]] [1] 600

Gpwner
fuente
3
myfun <- function(x, arg1) {
 # doing something here with x and arg1
}

xes un vector o una lista y myfunen lapply(x, myfun)se llama para cada elemento de xseparado.

Opción 1

Si desea usar entero arg1en cada myfunllamada ( myfun(x[1], arg1), myfun(x[2], arg1)etc.), use lapply(x, myfun, arg1)(como se indicó anteriormente).

opcion 2

Sin embargo, si desea llamar myfuna cada elemento de por arg1separado junto con elementos de x( myfun(x[1], arg1[1]), myfun(x[2], arg1[2])etc.), no es posible usar lapply. En su lugar, use mapply(myfun, x, arg1)(como se indicó anteriormente) o apply:

 apply(cbind(x,arg1), 1, myfun)

o

 apply(rbind(x,arg1), 2, myfun).
Hanna
fuente