私はリストのサブセット化を大量に実行する必要のあるいくつかのプロジェクトに取り組んできましたが、コードをプロファイリングしているときに、リストのサブセット化に対する object[["nameHere"]] アプローチは通常、object$nameHere アプローチよりも高速であることに気付きました。
例として、名前付きコンポーネントを含むリストを作成する場合:
a.long.list <- as.list(rep(1:1000))
names(a.long.list) <- paste0("something",1:1000)
どうしてこれなの:
system.time (
for (i in 1:10000) {
a.long.list[["something997"]]
}
)
user system elapsed
0.15 0.00 0.16
これより速い:
system.time (
for (i in 1:10000) {
a.long.list$something997
}
)
user system elapsed
0.23 0.00 0.23
私の質問は、この動作が普遍的に当てはまり、可能な限り $ サブセットを避けるべきかどうか、または最も効率的な選択は他の要因に依存するかどうかです。
ベストアンサー1
関数は[[
まずすべての要素を調べて完全一致を試み、それから部分一致を試みます。$
関数は各要素に対して完全一致と部分一致の両方を順番に試します。以下を実行すると、
system.time (
for (i in 1:10000) {
a.long.list[["something9973", exact=FALSE]]
}
)
つまり、完全一致がない部分一致を実行している場合、$
実際にはほんの少しだけ速くなることがわかります。