R aplica la función con múltiples parámetros


128

Tengo una función f(var1, var2)en R. Supongamos que establecemos var2 = 1y ahora quiero aplicar la función f()a la lista L. Básicamente quiero obtener una nueva lista L * con las salidas

[f(L[1],1),f(L[2],1),...,f(L[n],1)]

¿Cómo puedo hacer esto con cualquiera apply, mapplyo lapply?


Respuestas:


190

Simplemente pase var2 como argumento adicional a una de las funciones de aplicación.

mylist <- list(a=1,b=2,c=3)
myfxn <- function(var1,var2){
  var1*var2
}
var2 <- 2

sapply(mylist,myfxn,var2=var2)

Esto pasa lo mismo var2a cada llamada de myfxn. Si, por el contrario, desea que cada llamada myfxnobtenga el 1 ° / 2 ° / 3 ° / etc. elemento de ambos mylisty var2, entonces, estás en mapplyel dominio de.


55
pero tenga en cuenta que myfxnpuede estar vectorizado, en cuyo caso se debe usarmyfxn(unlist(mylist), var2=var2)
baptiste

El ejemplo original no estaba claro, pero parecía no estar vectorizado. Punto bien tomado, sin embargo.
Ari B. Friedman

¿Es la forma de hacer que esto funcione como una función "sobre la marcha"? Algo como esto: sapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)Pero me da un error de que el argumento 2 coincide con múltiples argumentos formales
emudrak

1
@emudrak Creo que el problema es que estás nombrando el argumento que pasas en varlugar de var2. R no puede adivinar lo que quieres decir.
Ari B. Friedman

49

Si su función tiene dos variables vectoriales y debe computarse a sí misma en cada valor de ellas (como lo menciona @Ari B. Friedman), puede usar mapplylo siguiente:

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
mapply(mult_one,vars1,vars2)

que te da:

> mapply(mult_one,vars1,vars2)
[1] 10 40 90

3
Un voto a favor para generalizar, incluso con un ejemplo simple y claro.
JASC

mapplytambién se reciclará si vars1tiene un solo elemento. Por ejemplo cuando vars1 <- 3, mapply(mult_one, vars1, vars2)vuelve 30 60 90. Esto es útil cuando desea usar lapplysobre el segundo argumento de una función.
Paul Rougieux

3

Para generalizar aún más el ejemplo de @ Alexander, outeres relevante en los casos en que una función debe calcularse a sí misma en cada par de valores vectoriales:

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
outer(vars1,vars2,mult_one)

da:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
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.