我的问题
如果一个对象x
被传递给一个f
修改它的函数,R 将创建一个修改后的本地副本x
withinf
的环境,而不是更改原始对象(由于 copy-on-change 原则)。但是,我有一种情况,x
它非常大并且一旦传递给就不需要了f
,所以我想避免存储x
一次f
调用的原始副本。有没有聪明的方法来实现这一目标?
f
是一个可能不太聪明的用户提供的未知功能。
我目前的解决方案
到目前为止,我最好的方法是包装x
一个函数,该函数对calledforget
进行新的本地引用,删除工作区中的原始引用,然后传递新的引用。问题是我不确定它是否能完成我想要的,它只适用于,这在我目前的情况下是一个交易破坏者。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
底线
我在做我希望我做的事吗?有更好的方法吗?