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?

Miguel
fuente
Pregunta similar: stackoverflow.com/questions/2545879/…
Scott C Wilson el

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.

Ari B. Friedman
fuente
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
Alejandro
fuente
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
ms609
fuente