2011-01-21 68 views
25

我有這樣的虛擬 - 一個功能:傳遞參數給迭代函數通過申請

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

現在,我想使用的功能使用應用的數據集。 問題是,apply(data,1,FUN(parameter=1))

將無法​​正常工作,因爲FUN不知道「x」是什麼。 有沒有辦法告訴應用以「x」作爲當前行/ col調用FUN? `

回答

24

你想要apply(data,1,FUN,parameter=1)。請注意,在函數定義的...

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

,並在文件中的相應條目:

...:可選的參數爲「FUN」。

13

您可以撥打電話內的匿名函數來apply使FUN會知道什麼是「x」是:

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

在使用這個方法的底部例子見?apply

+0

謝謝,大通,這是我正在尋找... – Produnis

+1

@Gavin - 我想我不明白在清晰度或性能的差異點。 R的文檔非常清楚,'...'是針對'FUN'的其他參數,因此請注意。然而,這僅僅是需要匿名函數功能的複雜性的一個小小的飛躍,我猜測OP以前並不知道這個「技巧」。 – Chase

+0

確實,因此是評論而不是反對票。你寫的東西沒有錯。並不意味着批評。 –

3

下面是使用...對象和*apply傳遞參數的實際示例。這是光滑的,這似乎是一個簡單的例子來解釋使用。需要記住的重要一點是,當您將參數定義爲...時,對該函數的所有調用都必須具有命名參數。 (所以R理解你想要放在哪裏)。例如,我本可以撥打times <- fperform(longfunction, 10, noise = 5000),但是離開noise =會給我一個錯誤,因爲它是通過...傳遞的。我的個人風格是如果使用...只是爲了安全起見,我將命名所有參數。

你可以看到參數noise在調用被定義爲fperform(FUN = longfunction, ntimes = 10, noise = 5000)但不被用於另外2個水平與調用diff <- rbind(c(x, runtime(FUN, ...))),並最終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=""))