Неизменяемые объекты в R - что здесь происходит под капотом? - PullRequest
0 голосов
/ 26 апреля 2019

Я немного растерялся.Я научился никогда не выращивать вектор, потому что мы не хотим каждый раз создавать новую копию объекта.

# Bad
start <- Sys.time()

vector1 <- vector()

for(i in 1:100000000) {
  vector1[i] <- i
}

end <- Sys.time()

print(end - start)
Time difference of 17.06454 secs  



# Good
vector2 <- vector(length = 100000000)

start <- Sys.time()

for(i in 1:100000000) {
  vector2[i] <- i
}

end <- Sys.time()

print(end - start)
Time difference of 4.50159 secs

Результаты, как правило, подтверждают это, однако, например, я читаю здесь: http://adv -r.had.co.nz / Functional-software.html что-то вроде этого: «Изменяемое состояние обычно сложно, потому что каждый раз, когда он выглядит, как будто вы модифицируете объект, вы фактически создаете изатем изменив копию. "

Так я не создаю копию каждый раз, когда сохраняю новое значение внутри вектора в примере 2?Разве это обычно не должно быть даже медленнее, потому что на каждой итерации копируется вектор размером 100.000.000?

Что я здесь не понимаю?

1 Ответ

2 голосов
/ 26 апреля 2019

Раздел, который вы читали, был в контексте функции. Если вы посмотрите раздел памяти , вы увидите

Что происходит с x в следующем коде?

x <- 1:10
x[5] <- 10

Есть две возможности:

  1. R изменяет x на месте.

  2. R делает копию x в новом месте, изменяет копию, а затем использует имя x, чтобы указать новое местоположение.

Оказывается, что R может делать либо в зависимости от обстоятельств. В приведенном выше примере он будет изменен на месте.

Итак, для того, что вы делаете, вы модифицируете на месте. Вы не будете изменять на месте что-то вроде этого:

f <- function(vec) {

    for(i in 1:length(vec)) {
        vec[i] <- i
    }

    return(vec)
}

Вы бы создали локальную (для функции) копию vec, прежде чем изменять копию на месте. Об этом говорила цитата Хэдли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...