私の質問
オブジェクトx
がそれを変更する関数に渡された場合、 f
R は元のオブジェクトを変更するのではなく、変更された の環境x
内のローカル コピーを作成します (コピー オン チェンジの原則により)。f
ただし、x
が非常に大きく、 に渡されると不要になる状況があるf
ため、 が呼び出されると元のコピーを保存することは避けたいと考えていx
ますf
。これを達成する賢い方法はありますか?
f
おそらくあまり賢くないユーザーによって提供される未知の関数です。
私の現在の解決策
これまでのところ、 calledへの新しいローカル参照を作成し、ワークスペース内の元の参照を削除してから、新しい参照を渡すx
関数をラップするのが最善です。問題は、それが私が望むものを達成できるかどうか確信が持てず、それが でしか機能しないことです。forget
x
y
globalenv()
forget <- function(x){
y <- x
# x and y now refers to the same object, which has not yet been copied
print(tracemem(y))
rm(list=deparse(substitute(x)), envir=globalenv())
# The outside reference is now removed so modifying `y`
# should no longer result in a copy (other than the
# intermediate copy produced in the assigment)
y
}
f <- function(x){
print(tracemem(x))
x[2] <- 9000.1
x
}
上記の関数を呼び出す例を次に示します。
> a <- 1:3
> tracemem(a)
[1] "<0x2ac1028>"
> b <- f(forget(a))
[1] "<0x2ac1028>"
[1] "<0x2ac1028>"
tracemem[0x2ac1028 -> 0x2ac1e78]: f
tracemem[0x2ac1e78 -> 0x308f7a0]: f
> tracemem(b)
[1] "<0x308f7a0>"
> b
[1] 1.0 9000.1 3.0
> a
Error: object 'a' not found
結論
私は自分がやりたいことをやっていますか?それを行うためのより良い方法はありますか?