2011-01-21 10 views
25

を適用します。渡す引数が通じ、私はこのダミー-1のような機能を持っている

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

今、私が適用されます使用してデータセットで機能を使用したいと思います。 問題は、その "x"が何であるか分からないので、apply(data,1,FUN(parameter=1))

が働きません。 「x」を現在の行/列として使用してFUNを呼び出すには、適用を指示する方法はありますか? `

答えて

24

あなたがほしいapply(data,1,FUN,parameter=1)です。関数定義の...注:

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

やドキュメント内の対応するエントリ:

...:「FUN」にオプションの引数。

13

あなたはので、FUNは、「x」が何であるか知っているだろうapplyへの呼び出し内で無名関数を行うことができます。

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)と呼んでいたかもしれませんが、を渡すとエラーが表示されます。...私の個人的なスタイルは、...が安全のために使用されている場合、すべての引数に名前を付けることです。

あなたは、引数noisefperform(FUN = longfunction, ntimes = 10, noise = 5000)への呼び出しで定義されているが、diff <- rbind(c(x, runtime(FUN, ...)))を呼び出して、別の2つのレベルのために使用されていないと、最終的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="")) 
関連する問題