実際、オブジェクトを渡し、メモリを使用しています。しかし、オブジェクトを渡さずに R でオブジェクトの操作を行うことはできないと思います。関数を作成せず、関数の外で操作を行った場合でも、R は基本的に同じように動作します。
これを確認する最善の方法は、例を設定することです。Windows を使用している場合は、Windows タスク マネージャーを開きます。Linux を使用している場合は、ターミナル ウィンドウを開いて top コマンドを実行します。この例では Windows を想定しています。R で以下を実行します。
col1<-rnorm(1000000,0,1)
col2<-rnorm(1000000,1,2)
myframe<-data.frame(col1,col2)
rm(col1)
rm(col2)
gc()
これにより、col1 と col2 という 2 つのベクトルが作成され、それらが myframe というデータ フレームに結合されます。次に、ベクターを削除し、ガベージ コレクションを強制的に実行します。Windows タスク マネージャーで、Rgui.exe タスクのメモリ使用状況を確認します。Rを起動すると、約19メガのメモリが使用されます。上記のコマンドを実行した後、私のマシンは R に 35 メガ未満しか使用していません。
これを試してください:
myframe<-myframe+1
R のメモリ使用量は 144 MB を超えるはずです。gc() を使用してガベージ コレクションを強制すると、約 35 MB に戻ることがわかります。関数を使用してこれを試すには、次のようにします。
doSomething <- function(df) {
df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)
上記のコードを実行すると、メモリ使用量が 160 MB 程度まで跳ね上がります。gc() を実行すると、35 MB に戻ります。
では、これらすべてをどうすればよいのでしょうか。関数の外で操作を行うことは、関数内で行うよりも (メモリの点で) それほど効率的ではありません。ガベージ コレクションは本当に素晴らしいものをクリーンアップします。gc() を強制的に実行する必要がありますか? おそらく、必要に応じて自動的に実行されるわけではありませんが、上記で実行して、メモリ使用量にどのように影響するかを示しました。
それが役立つことを願っています!