2012-05-18 12 views
15

Rは、関数に引数を渡したり、変数のコピーを作成したりする際に、メモリ使用量に関して使用するロジックを理解したいと思います。実際に変数のコピーを作成するのはいつですか?その変数への参照を渡すだけですか?特に、私は好奇心午前の状況は以下のとおりです。深い対浅いコピー、参照渡し

f <- function(x) {x+1} 
a <- 1 
f(a) 

は文字通り渡されるaですか渡されるへの参照ですか?

x <- 1 
y <- x 

コピーの参照?これはいつですか?

誰かが私にこれを説明できるなら、私は非常に感謝します。

+3

-lang.html#Evaluation)のセクションを参考にしてください。 – joran

+2

Morandatとその同僚のこの論文は、Rの引数の遅延評価に関する興味深く重要な議論をしています。http://www.cs.purdue.edu/homes/jv/pubs/ecoop12.pdf – jthetzel

+4

'tracemem'を適切に使うコンパイルされたRは 'NAM'EDフィールドを理解した' .Internal(inspect(x)) 'と同様に探査に役立ちます。私の一般的なマントラは 'copy-on-change'なので、元のものに変更がないので、 'y < - x'はコピーをトリガしません。' x'(と ' y ")は、いずれかの修正によってコピーがトリガーされるように、「命名」される。 –

答えて

12

変数を渡すときは、常に参照ではなくコピーを使用します。ただし、割り当てが実際に発生するまでコピーを作成しないこともあります。このプロセスの実際の説明は、忠実なものです。

?force 
?delayedAssign 

一つの実用的な意味合いは不可能ではない、あなたのオブジェクトは、名目上占めるように少なくとも二倍のRAMを必要とする避けるためにあれば、それは非常に困難であるということであるドキュメントを見てみましょう。大きなオブジェクトを変更するには、通常、一時的なコピーを作成する必要があります。

update:2015:Matt Dowle氏によると、彼のdata.tableパッケージはコピーの重複の問題を回避する代入の代替ルートを提供しています。更新が要求された場合、提案がなされた時点ではそれを理解できませんでした。

applyReduceの評価ルールでR 3.2.1が最近変更されました。それは、ここでニュースを参照して、SO-発表されました:Returning anonymous functions from lapply - what is going wrong?

そしてinteresting paper cited by jhetzel in the comments is now here:あなたはhttp://cran.at.r-project.org/doc/manuals/R [この](見つけるかもしれない

+8

['data.table'](http://datatable.r-forge.r-project.org/)と入力してください。パッケージの '?copy'を参照してください。参照による代入は、 ':= '演算子で可能で、'? ":=" 'と一連の' set * '関数を参照してください。オブジェクト全体のコピーを2〜3枚必要とするのではなく、1列分の作業メモリまたはそれ以下のメモリしか必要としません。 –

関連する問題