2015-06-21 33 views
13

Czy istnieje sposób na uniknięcie kopiowania na modyfikacje w miejscu modyfikacji macierzy w R?Modyfikacje macierzy w miejscu w R

Próbuję skopiować mniejszą macierz do plasterka większej macierzy w następujący sposób.

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

, która zwraca ten sam adres na moim komputerze (z prefiksem "0x"). – jenesaisquoi

+3

Kiedy próbuję powyższych poleceń za pomocą 'address' z pakietu data.table lub z pakietu pryr otrzymuję ten sam adres dla dwóch powyższych instancji. Zaproponuj wypróbowanie nowszej wersji R. Podaj również samodzielne próbki kodu, w tym zaproszenia do biblioteki. –

+3

Używając 'data.table :: address', mam takie samo zachowanie jak OP. (R 3.2.0, RStudio 0.99.441, Windows 8.0, data.table 1,9,5). Ale w przypadku konsoli R zwracam ten sam adres. Tak więc problem dotyczy RStudio. – user227710

Odpowiedz

9

uzyskać takie samo zachowanie jak PO używając R 3.2.0 uruchomiony w ciągu RStudio 0.99.441 Windows 8.1 i stosując pryr::address. Problem polega na tym, że RStudio ma odnośnik do y dla panelu Environment. Jak często zdarza się, Hadley Wickham ma doskonałą dokumentację tego.

Nie sądzę, że jest jakikolwiek sposób obejścia tego problemu dla macierzy w środowisku globalnym, z wyjątkiem używania RStudio. Próbowałem kilku innych rzeczy. Macierze wewnątrz funkcji są w porządku:

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)) 
} 

Wywołanie fn() powinien pokazać, że adres nie jest zmieniany.

Jednak tworzenie y jako członka listy lub środowiska znajdującego się w środowisku globalnym nie zapobiega zapisywaniu kopii podczas zapisu (na przykład x <- new.env(); x$y <- matrix(...)).

Per Is there any way to disable environment pane in RStudio? wydaje się, że nie ma żadnego sposobu na wyłączenie panelu środowiska.

data.table nadal udaje się ominąć niepotrzebne kopie. Wypróbuj:

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)