就地修改R中的矩阵
In place modification of matrices in R
我有什么方法可以避免在 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"
我在 Windows 8.1 上的 RStudio 0.99.441 中使用 R 3.2.0 运行 并使用 pryr::address
得到与 OP 相同的行为。问题是 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))
}
调用fn()
应该显示地址没有改变。
但是,将 y 创建为全局环境中的列表或环境的成员不会阻止写入时复制(例如 x <- new.env(); x$y <- matrix(...)
)。
根据 似乎没有任何方法可以禁用环境窗格。
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)
我有什么方法可以避免在 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"
我在 Windows 8.1 上的 RStudio 0.99.441 中使用 R 3.2.0 运行 并使用 pryr::address
得到与 OP 相同的行为。问题是 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))
}
调用fn()
应该显示地址没有改变。
但是,将 y 创建为全局环境中的列表或环境的成员不会阻止写入时复制(例如 x <- new.env(); x$y <- matrix(...)
)。
根据
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)