2011-01-21 20 views
25

Mam funkcji, jak tego manekina-on:Przekazywanie argumentów do funkcji powtórzyć poprzez zastosowanie

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

Teraz chciałbym użyć funkcji na zbiorze danych z wykorzystaniem zastosowania. Problem polega na tym, że praca nie będzie działać, ponieważ FUN nie wie, co to jest "x". Czy istnieje sposób, aby powiedzieć, aby zadzwonić FUN z "x" jako bieżącym wierszu/col? `

Odpowiedz

24

Chcesz apply(data,1,FUN,parameter=1). Zwróć uwagę na ... w definicji funkcji:

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

i odpowiedniego wpisu w dokumentacji:

...: opcjonalne argumenty do „zabawy”.

13

Można dokonać anonimowej funkcji w wywołaniu apply tak że FUN będzie wiedział, co „x” oznacza:

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

Zobacz ?apply przykłady na dole, które korzystają z tej metody.

+0

Dzięki, Chase, to to jest to, czego szukałem ... – Produnis

+1

@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

+0

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. –

3

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="")) 
Powiązane problemy