2015-06-21 1 views
13

Есть ли способ избежать копирования-на-модификации для модификаций матриц на месте в 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" 
+2

, который возвращает тот же адрес на моем comp (и с префиксом «0x»). – jenesaisquoi

+3

Когда я пытаюсь выполнить вышеуказанные команды с помощью 'address' из пакета data.table или из пакета pryr, я получаю тот же адрес для двух экземпляров выше. Предложите вам попробовать более новую версию R. Также, пожалуйста, предоставьте самостоятельно содержащиеся образцы кода, включая вызовы библиотек. –

+3

Используя 'data.table :: address', я получаю то же поведение, что и OP. (R 3.2.0, RStudio 0.99.441, Windows 8.0, data.table 1,9,5). Но, с консолью R, я возвращаю тот же адрес. Итак, проблема в RStudio. – user227710

ответ

9

я получаю такое же поведение, как 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(...)).

В отношении 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)