私はすべての機能を記述しようとしているときはいつも、require(<pkgname>)
を使用していますが、代わりに::
を使用することを常に考えていました。存在しないパッケージの名前を指定するとエラーを返すlibrary
とは異なり、require
をlibrary
よりもよく実行すると、require
が警告を返し、FALSE
を返します。R書くスタイル - 必要と対::
一方、require
はパッケージ全体を読み込んでいます(少なくとも私もそうだと思いますが)。オペレータが変数を取得するので、スピードの違いがまず私の心に来ました。 ::
はrequire
より速くなければなりません。
そして、私はそれをチェックするために、いくつかの分析をした - 私は、それぞれrequire
と::
で、foreign
パッケージからread.systat
機能をロードする2つの簡単な関数を書いて、それ故にforeign
パッケージに同梱、複製された機能の1000倍というIris.syd
データセットをインポートしますそれぞれ(恥知らずに恣意的であった)、そして...いくつかの数字を突っ込んだ。
奇妙なことに、私はユーザーCPUと経過時間に大きな違いがありましたが、システムCPUの点では大きな違いはありませんでした。そしてさらに奇妙な結論:::
は実際には遅いです! ::
のドキュメントは非常に鈍いです。ソースを見るだけで、::
の方が優れているはずです。
は
#!/usr/local/bin/r
## with require
fn1 <- function() {
require(foreign)
read.systat("Iris.syd", to.data.frame=TRUE)
}
## times
n <- 1e3
sink("require.txt")
print(t(replicate(n, system.time(fn1()))))
sink()
ダブルコロン
#!/usr/local/bin/r
## with ::
fn2 <- function() {
foreign::read.systat("Iris.syd", to.data.frame=TRUE)
}
## times
n <- 1e3
sink("double_colon.txt")
print(t(replicate(n, system.time(fn2()))))
sink()
グラブCSVデータhereを必要とします。いくつかの統計情報:
user CPU: W = 475366 p-value = 0.04738 MRr = 975.866 MRc = 1025.134
system CPU: W = 503312.5 p-value = 0.7305 MRr = 1003.8125 MRc = 997.1875
elapsed time: W = 403299.5 p-value < 2.2e-16 MRr = 903.7995 MRc = 1097.2005
MRRはrequire
、::
のためのMRC前掲の平均順位です。私はここで何か間違っていたに違いない。それはちょっと意味がありません... ::
の実行時間は速いようですね!!!私は何かをねじったかもしれません、あなたはそのオプションを捨てるべきではありません...
OK ...私はいくつかの違いがあることを確認するために私の時間を無駄にした、と私は完全に役に立たない分析を行った、バックの質問に:
"機能を書くときはなぜ1は::
上require
を好むはずです?"
=)
は、パッケージ内のスタンドアロン関数や機能のためにこれは、比較? – hadley
また、通常は、スクリプトの先頭に一度()を必要とし、すべての関数呼び出しで一度は必要としません。 – hadley
スタンドアロン機能用です。私はWebアプリケーションを開発しています。そしてRApacheは各HTTPリクエストで新しいRセッションを開始するので、私は不必要なサーバーの負荷を避けようとしています。この例は不適切です。一度ファイルを読み込んだら、ジョブは終了しましたが、AJAX呼び出しのある対話型Webアプリケーションでは、これは非常に非効率的です。 – aL3xa