大きなオブジェクトを操作する場合、値渡しのメモリと速度への影響はかなり大きくなる可能性があります。
R には参照渡しの方法がいくつかあります。
- 参照クラス
- R.oo
- C/C++/その他の外部言語
- 環境
ただし、それらの多くは (コードの複雑さとプログラマーの時間の点で) かなりのオーバーヘッドを必要とします。
特に、C++ で定数参照を使用できるようなものを想定しています。大きなオブジェクトを渡し、それを変更せずに計算し、その計算の結果を返します。
R には定数の概念がないため、これがどこかで発生する場合は、コンパイラがコード内のどこでも仮引数が変更されていないことを確認でき、参照によって渡すことができるコンパイル済みの R 関数であると思われます。
引数が変更されていない場合、R コンパイラは参照渡しを行いますか? そうでない場合、そうするのに技術的な障壁はありますか、それともまだ実装されていないだけですか?
コード例:
n <- 10^7
bigdf <- data.frame( x=runif(n), y=rnorm(n), z=rt(n,5) )
myfunc <- function(dat) invisible(with( dat, x^2+mean(y)+sqrt(exp(z)) ))
library(compiler)
mycomp <- compile(myfunc)
tracemem(bigdf)
> myfunc(bigdf)
> # No object was copied! Question is not necessary