2015-06-21 11 views
13

C'è un modo per evitare la copia su modifica per le modifiche sul posto delle matrici in R?Modifica in posto delle matrici in R

Sto provando a copiare una matrice più piccola su una fetta di matrice più grande come segue.

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

che restituisce lo stesso indirizzo sul mio comp (e con prefisso "0x"). – jenesaisquoi

+3

Quando provo i comandi precedenti usando 'address' dal pacchetto data.table o dal pacchetto pryr, ottengo lo stesso indirizzo per le due istanze di cui sopra. Suggerisco di provare una versione più recente di R. Si prega inoltre di fornire esempi di codice autonomo comprese le chiamate in biblioteca. –

+3

Usando 'data.table :: address', ottengo lo stesso comportamento di OP. (R 3.2.0, RStudio 0.99.441, Windows 8.0, data.table 1,9,5). Ma con la console R, restituisce lo stesso indirizzo. Quindi, il problema è con RStudio. – user227710

risposta

9

ottengo lo stesso comportamento come il PO utilizzando R 3.2.0 in esecuzione all'interno di RStudio 0.99.441 su Windows 8.1 e l'utilizzo di pryr::address. Il problema è che RStudio ha un riferimento a y per il suo riquadro Ambiente. Come spesso è il caso, Hadley Wickham ha una documentazione eccellente di questo.

Non credo che ci sia un modo per aggirare questo per le matrici nell'ambiente globale oltre che non usare RStudio. Ho provato un paio di altre cose. Matrici all'interno di una funzione vanno bene:

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() dovrebbe dimostrare che l'indirizzo è invariato.

Tuttavia, la creazione di y come membro di un elenco o di un ambiente che si trovano nell'ambiente globale non impedisce la copia in fase di scrittura (ad esempio x <- new.env(); x$y <- matrix(...)).

Per Is there any way to disable environment pane in RStudio? non sembra esserci alcun modo per disabilitare il riquadro dell'ambiente.

data.table riesce comunque a evitare copie non necessarie. Prova:

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) 
Problemi correlati