35

私はこのダミーのような機能を持っています:

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」を使用してFUNを呼び出すように適用するように指示する方法はありますか? `

4

3 に答える 3

36

あなたがしたいapply(data,1,FUN,parameter=1)...関数定義の次の点に注意してください。

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

およびドキュメント内の対応するエントリ:

...: 'FUN' へのオプションの引数。

于 2011-01-21T15:55:53.000 に答える
17

applyFUN が "x" が何であるかを認識できるように、呼び出し内で無名関数を作成できます。

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

?applyこのメソッドを使用する例については、下部を参照してください。

于 2011-01-21T15:57:41.810 に答える
3

...オブジェクト andを使用して引数を渡す実用的な例を次に示します*apply。滑らかで、これは使用法を説明する簡単な例のように思えました。覚えておくべき重要な点は...、その関数へのすべての呼び出しには名前付き引数が必要であるため、引数を定義するときです。(そのため、R は、何をどこに置こうとしているのかを理解します)。たとえば、呼び出すことはできましたがtimes <- fperform(longfunction, 10, noise = 5000)、省略しnoise =ているとエラーが発生しました。これは、パススルーされているためです。安全のために... a を使用する場合は、すべての引数に名前を付けるのが私の個人的なスタイルです。...

への呼び出しで引数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=""))
于 2012-10-08T19:05:49.890 に答える