2011-07-26 17 views
88

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

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

¿Cómo se hace esto con cualquiera apply, mapply o lapply?

+0

Pregunta similar: http://stackoverflow.com/questions/2545879/row-column-counter-in-apply-functions/28102021#28102021 –

Respuesta

127

Simplemente pase var2 como argumento adicional a una de las funciones de aplicar.

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

sapply(mylist,myfxn,var2=var2) 

Esta pasa la misma var2 a cada llamada de myfxn. Si, en su lugar, desea que cada llamada de myfxn obtenga el 1º/2º/3º/etc. elemento de mylist y var2, entonces estás en el dominio mapply.

+4

pero tenga en cuenta que 'myfxn' pueden ser vectorizados, en cuyo caso uno debería usar 'myfxn (unlist (mylist), var2 = var2)' – baptiste

+0

El ejemplo original no estaba claro pero parecía no ser vectorizado. Sin embargo, apunta bien. –

+0

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

8

Si su función tiene dos variables vectoriales y debe calcular sí en cada valor de ellos (como se ha mencionado por @Ari B. Friedman) se puede utilizar mapply de la siguiente manera:

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

que le ofrece:

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

Utilicé RODBC para conectarme al esquema de Oracle XE hr. Necesitaba una función que pudiera devolver el número de registros en una tabla. Entonces ...

function(rodbcConnection, schemaName, tableName){ 
    results <- sqlQuery(rodbcConnection, paste("SELECT * FROM ", schemaName, ".", tableName)) 
    return(dim(results)[1]) 
} 

¿Pero cómo aplicar esto a un vector de nombres de tablas? Así es cómo.

> x <- sapply(hrTableNames, noOfRecords, rodbcConnection=connection, schemaName="hr") 

hace lo sapply su trabajo, aplicando los noOfRecords función a cada fila de hrTableNames, R sustituye el nombreTabla parámetro que falta con el valor actual de iterativo hrTableNames.

Finalmente.

> barplot(t(x), las=2) 
Cuestiones relacionadas