Oto praktyczny przykład przekazywania argumentów za pomocą obiektu i *apply
. Jest śliski i wydawało się to łatwym przykładem wyjaśnienia użycia. Ważnym punktem do zapamiętania jest to, że zdefiniowanie argumentu jako ...
powoduje, że wszystkie wywołania tej funkcji muszą mieć nazwane argumenty. (więc R rozumie, co próbujesz umieścić). Na przykład mógłbym zadzwonić pod numer times <- fperform(longfunction, 10, noise = 5000)
, ale pomijanie numeru noise =
spowodowałoby błąd, ponieważ został przekazany przez ...
Mój osobisty styl polega na nazwaniu wszystkich argumentów, jeśli ...
jest używany tylko po to, aby być bezpiecznym.
Można zobaczyć, że argument noise
jest określona w zaproszeniu do fperform(FUN = longfunction, ntimes = 10, noise = 5000)
ale nie jest używany przez kolejne 2 poziomach z wezwaniem do diff <- rbind(c(x, runtime(FUN, ...)))
i ostatecznie 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=""))
Dzięki, Chase, to to jest to, czego szukałem ... – Produnis
@Gavin - Chyba nie doceniam różnicy w jasności i wydajności. Dokumenty R są dość jasne, że '...' są dla dodatkowych parametrów do 'ZABAWY ', więc należy to zauważyć. Jednak jest to niewielki skok w złożoności, ponieważ potrzebujemy tej anonimowej funkcji i domyślam się, że OP nie znał wcześniej tej "sztuczki". – Chase
Rzeczywiście, stąd komentarz, a nie głosowanie w dół. Nic złego w tym, co napisałeś w ogóle. Nie było rozumiane jako krytyka. –