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=""))
Gracias, Chase, esta es lo que estaba buscando ... – Produnis
@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
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. –