コメントを追跡するのが難しく、これについてすでに1つのコメントを失っているため、これを完全な回答にする必要があると思います... forの違いを示すnullglobの例があり、他の例よりもはるかに優れたファミリ関数を適用します. 関数が非常に遅くなるようにすると、すべての速度が消費され、ループのバリエーション間の違いは見られなくなります。しかし、関数を自明にすると、ループがどれだけ物事に影響を与えるかがわかります。
また、他の例では調べられていない apply ファミリーの一部のメンバーには、興味深いパフォーマンス特性があることも付け加えておきます。最初に、私のマシンでの nullglob の相対的な結果の複製を示します。
n <- 1e6
system.time(for(i in 1:n) sinI[i] <- sin(i))
user system elapsed
5.721 0.028 5.712
lapply runs much faster for the same result
system.time(sinI <- lapply(1:n,sin))
user system elapsed
1.353 0.012 1.361
彼はまた、sapply がはるかに遅いことも発見しました。テストされていない他のいくつかを次に示します。
単純な古いデータの行列バージョンに適用されます...
mat <- matrix(1:n,ncol =1),1,sin)
system.time(sinI <- apply(mat,1,sin))
user system elapsed
8.478 0.116 8.531
そのため、apply() コマンド自体は for ループよりも大幅に遅くなります。(sin(mat[i,1]) を使用しても、for ループはそれほど遅くなりません。
他の投稿でテストされていないように見えるもう 1 つの方法は、tapply です。
system.time(sinI <- tapply(1:n, 1:n, sin))
user system elapsed
12.908 0.266 13.589
もちろん、この方法で tapply を使用することは決してありません。ほとんどの場合、そのユーティリティはそのような速度の問題をはるかに超えています。