0

applyR (およびそのすべてのバリアント)について質問があります。動作中に関数の引数を更新する方法はありapplyますか?

たとえば、NextSol(Prev_Sol)から新しいソリューションを生成しPrev_Sol、何らかの方法で元のソリューションと比較し、比較の結果に応じて元のソリューションまたは新しいソリューションを返す関数があります。返されたすべてのソリューションを保存する必要があります。現在、私はこれをやっています:

for( i in 2:N ) {
  Results[[i]] <- NextSol(Results[[i-1]])
}

applyしかし、おそらく?を使用してそれを行う(より高速な)方法があります それが役立つことも見Reduceましたが、どのように使用できるかわかりません。どんな助けでも大歓迎です!

4

1 に答える 1

4

Thomas が言ったように、for ループは、ある反復が前の反復に依存する場合の標準的なループ方法です。N = 1(コード内での大文字と小文字を正しく処理していることを確認してください。)

別の方法は、関数を使用するReduceことです。この例は、?Reduceヘルプ ページの例を基にしています。

NextSol <- function(x) x + 1 #Or whatever you want

Funcall <- function(f, ...) f(...)
Reduce(Funcall, rep.int(list(NextSol), 5), 0, right = TRUE)
## [1] 5

これがはるかに高速になる可能性は低く、間違いなく読みにくいため、for ループに固執することを決定することもできます。


そうですね、関数で囲めば読みやすくなると思いIterateます。

Iterate <- function(f, init, n)
{
  Reduce(
    function(f, ...) f(...), 
    rep.int(list(f), n), 
    init, 
    right = TRUE
  )
}

Iterate(NextSol, 0, 5) #same as before
于 2013-10-22T08:41:21.623 に答える