在R中修改矩阵

Cro*_*ops 13 r matrix copy-on-write data.table

我有什么方法可以避免修改副本的原位修改R

我试图将较小的矩阵复制到一个较大的矩阵切片,如下所示.

library(data.table)
y <- matrix(c(11,21,31,12,22,32),nrow=3,ncol=2)
address(y)
[1] "08429190"

y[2:3,] <- matrix(c(1,1,8,12),nrow=2)
address(y)
[1] "0E033D28"
Run Code Online (Sandbox Code Playgroud)

Nic*_*edy 9

我使用在Windows 8.1上运行RStudio 0.99.441并使用的R 3.2.0获得与OP相同的行为pryr::address.问题是RStudio的环境窗格引用了y.像往常一样,Hadley Wickham有一些很好的文档.

我不认为除了不使用RStudio之外,还有任何方法可以解决全局环境中的矩阵问题.我尝试过其他几件事.函数中的矩阵很好:

library("pryr")
fn <- function() {
  y <- matrix(c(11,21,31,12,22,32),nrow=3,ncol=2)
  print(address(y))
  y[2:3,] <- matrix(c(1,1,8,12),nrow=2)
  print(address(y))
}
Run Code Online (Sandbox Code Playgroud)

调用fn()应显示地址未更改.

但是,将y创建为全局环境中的列表或环境的成员不会阻止写入时的副本(例如x <- new.env(); x$y <- matrix(...)).

Per 有没有办法在RStudio中禁用环境窗格?似乎没有任何方法可以禁用环境窗格.

data.table仍设法避免不经意的复制.尝试:

library("data.table")
x <- as.data.table(matrix(c(11,21,31,12,22,32),nrow=3,ncol=2))
address(x)
x[2:3, `:=`(V1 = c(1, 1), V2 = c(8, 12))]
address(x)
x[, V3 := V1 + V2]
address(x)
Run Code Online (Sandbox Code Playgroud)