【问题标题】:In place modification of matrices in R [duplicate]就地修改R中的矩阵[重复]
【发布时间】:2015-09-07 05:22:30
【问题描述】:

我有什么方法可以避免在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"

【问题讨论】:

  • 在我的 comp 上返回相同的地址(并带有前缀“0x”)。
  • 当我使用来自 data.table 包或 pryr 包的address 尝试上述命令时,我得到上述两个实例的相同地址。建议您尝试更新版本的 R。另外请提供包含库调用的自包含代码示例。
  • 使用 data.table::address,我得到与 OP 相同的行为。 (R 3.2.0、RStudio 0.99.441、Windows 8.0、data.table 1、9、5)。但是,使用 R 控制台,它返回相同的地址。所以,问题出在 RStudio。

标签: r matrix data.table copy-on-write


【解决方案1】:

使用在 Windows 8.1 上的 RStudio 0.99.441 中运行的 R 3.2.0 并使用 pryr::address,我得到了与 OP 相同的行为。问题是 RStudio 在其 Environment 窗格中引用了 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 &lt;- new.env(); x$y &lt;- matrix(...))。

根据Is there any way to disable environment pane in 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2017-05-08
    • 1970-01-01
    • 2017-12-14
    • 2022-11-15
    • 2019-07-19
    相关资源
    最近更新 更多