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.