In place modification of matrices in R [duplicate]

旧时模样 提交于 2019-11-29 13:13:52
Nick Kennedy

I get the same behaviour as the OP using R 3.2.0 running within RStudio 0.99.441 on Windows 8.1 and using pryr::address. The issue is RStudio has a reference to y for its Environment pane. As often the case, Hadley Wickham has some excellent documentation of this.

I don't think there's any way around this for matrices in the global environment other than not using RStudio. I've tried a couple of other things. Matrices within a function are fine:

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))
}

Calling fn() should show that the address is unchanged.

However, creating y as a member of a list or environment which are in the global environment doesn't prevent the copy on write (e.g. x <- new.env(); x$y <- matrix(...)).

Per Is there any way to disable environment pane in RStudio? there doesn't seem to be any way of disabling the environment pane.

data.table still manages to avoid unncessarily copies. Try:

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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!