時間の経過とともにデータ構造を成長させるのではなく、パフォーマンスのために書き込みたい事前に割り当てられたデータ構造があるとします。最初に、sapplyを使用してこれを試しました:
set.seed(1)
count <- 5
pre <- numeric(count)
sapply(1:count, function(i) {
pre[i] <- rnorm(1)
})
pre
# [1] 0 0 0 0 0
for(i in 1:count) {
pre[i] <- rnorm(1)
}
pre
# [1] -0.8204684 0.4874291 0.7383247 0.5757814 -0.3053884
これは、の無名関数がsapply
別のスコープ (または R の環境ですか?) にあり、結果としてpre
オブジェクトが同じではないためだと思います。for ループは同じスコープ/環境に存在するため、期待どおりに機能します。
私は通常、適用関数と for を使用した反復に R メカニズムを採用しようとしましたが、ここではそれを回避する方法がわかりません。私がやるべきこと、またはこのタイプの操作のためのより良いイディオムはありますか?
前述のように、私の例は非常に不自然であり、通常の逸脱を生成することに興味はありません。代わりに、実際のコードは 4 列 150 万行のデータフレームを処理しています。以前は、最終的なデータフレームを取得するために成長とマージに頼っていましたが、マージを避け、ベンチマークに基づいて事前に割り当てることにしました。