当我们在 R 中将一个变量的值分配给另一个变量时,它们在具有不同的值之前会共享相同的内存位置。这可以节省内存,但有时会引起麻烦。例如,如果我将变量 a0 的值分配给变量 b0,然后通过引用将 a0 和 b0 都传递给 Rcpp 函数,则更改函数中 a0 的值将导致 b0 发生意外更改。我需要在更改 a0 之前制作 b0 的额外副本以保存该值。
为了避免上述麻烦,使用 as.numeric() (对于向量)和 data.frame() (对于数据帧)将一个变量的值分配给另一个变量将迫使 R 在单独的内存位置进行复制。但是,这不适用于长度为 1 的向量(标量)。
a0=1:3
b0=a0
c0=as.numeric(a0)
tracemem(a0) == tracemem(b0)#TRUE
tracemem(a0) == tracemem(c0)#FALSE
a0=4
b0=a0
c0=as.numeric(a0)
tracemem(a0) == tracemem(b0)#TRUE
tracemem(a0) == tracemem(c0)#TRUE
我认为有一些解决方法,例如制作额外的副本来保存该值或对标量进行简单的加减更改以使值不同。但我想知道人们通常如何处理这个问题。
只需发现 as.numeric(a0)[1] 会在不同的内存位置创建一个副本
a0=4
b0=as.numeric(a0)
c0=as.numeric(a0)[1]
tracemem(a0) == tracemem(b0)#TRUE
tracemem(a0) == tracemem(c0)#FALSE