2

大きなオブジェクトを操作する場合、値渡しのメモリと速度への影響はかなり大きくなる可能性があります。

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
4

1 に答える 1

1

これはあなたが必要としているものとはかけ離れているかもしれませんが、オブジェクトをクロージャーでラップするのはどうでしょうか? この関数は、その親に渡されたオブジェクトを認識する関数を作成します。ここでは、tinyvolcanoを使用して非常に単純な作業を行います。

mkFun <- function(x) {
    function(rownumbers) {
    rowSums(x[rownumbers , , drop = FALSE])
    }
}


fun <- mkFun(volcano)

fun(2)  ##1] 6493
fun(2:3)  ##[1] 6493 6626

funワーカー関数によって渡されて、好きなように仕事をすることができるようになりました。

于 2012-08-01T04:40:04.370 に答える