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?


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.


¿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


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


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).
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.