Подтвердить что ты не робот

На месте модификации матриц в 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"
4b9b3361

Ответ 1

Я получаю то же поведение, что и OP, используя R 3.2.0, работающий в RStudio 0.99.441 в Windows 8.1 и используя 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))
}

Вызов 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)