2011-01-21 10 views
25

tengo una función como esta ficticia uno:Paso de argumentos a la función iterada solicitar a través de

FUN <- function(x, parameter){ 
    if (parameter == 1){ 
     z <- DO SOMETHING WITH "x"} 
    if (parameter ==2){ 
     z <- DO OTHER STUFF WITH "x"} 
return(z) 
} 

Ahora, me gustaría utilizar la función en un conjunto de datos utilizando aplicar. El problema es que apply(data,1,FUN(parameter=1))

no funcionará, ya que FUN no sabe qué es "x". ¿Hay alguna manera de decir aplicar para llamar a FUN con "x" como la fila/col actual? `

Respuesta

24

Quiere apply(data,1,FUN,parameter=1). Tenga en cuenta el ... en la definición de función:

> args(apply) 
function (X, MARGIN, FUN, ...) 
NULL 

y la entrada correspondiente de la documentación:

...: argumentos opcionales a FUN.

13

Usted puede hacer una función anónima dentro de la llamada a apply por lo que la diversión sabrá lo que "x" es:

apply(data, 1, function(x) FUN(x, parameter = 1)) 

Ver ?apply de ejemplos en la parte inferior que utilizan este método.

+0

Gracias, Chase, esta es lo que estaba buscando ... – Produnis

+1

@Gavin - Supongo que no aprecio la diferencia en cuanto a claridad o rendimiento. Los documentos R son bastante claros de que los '...' son para parámetros adicionales a 'DIVERSIÓN ', por lo que el punto se anota debidamente. Sin embargo, es solo un pequeño salto en complejidad a la necesidad de esa capacidad de función anónima y supongo que el OP no conocía ese "truco" previamente. – Chase

+0

De hecho, de ahí un comentario y no un voto a la baja. No hay nada malo con lo que escribiste en absoluto. No fue significado como crítica. –

3

Aquí hay un ejemplo práctico de pasar argumentos utilizando el objeto ... y *apply. Es resbaladizo, y este parecía un ejemplo fácil de explicar el uso. Un punto importante para recordar es que cuando define un argumento como ..., todas las llamadas a esa función deben tener argumentos con nombre. (por lo que R entiende lo que intentas ubicar). Por ejemplo, podría haber llamado al times <- fperform(longfunction, 10, noise = 5000) pero dejar noise = me hubiera dado un error porque se está pasando por ... Mi estilo personal es nombrar todos los argumentos si se usa un ... solo para estar seguro.

Se puede ver que el argumento noise se está definiendo en la llamada a fperform(FUN = longfunction, ntimes = 10, noise = 5000) pero no está siendo utilizada por otros 2 niveles, con la llamada a diff <- rbind(c(x, runtime(FUN, ...))) y en última instancia fun <- FUN(...)

# Made this to take up time 
longfunction <- function(noise = 2500, ...) { 
    lapply(seq(noise), function(x) { 
    z <- noise * runif(x) 
    }) 
} 

# Takes a function and clocks the runtime 
runtime <- function(FUN, display = TRUE, ...) { 
    before <- Sys.time() 
    fun <- FUN(...) 
    after <- Sys.time() 
    if (isTRUE(display)) { 
    print(after-before) 
    } 
    else { 
    after-before 
    } 
} 

# Vectorizes runtime() to allow for multiple tests 
fperform <- function(FUN, ntimes = 10, ...) { 
    out <- sapply(seq(ntimes), function(x) { 
    diff <- rbind(c(x, runtime(FUN, ...))) 
    }) 
} 

times <- fperform(FUN = longfunction, ntimes = 10, noise = 5000) 

avgtime <- mean(times[2,]) 
print(paste("Average Time difference of ", avgtime, " secs", sep="")) 
Cuestiones relacionadas