Копирование при модификации отличается в `c (1L, 2L, 3L)` и `1: 3` - PullRequest
4 голосов
/ 16 апреля 2019

Я читаю Advanced R от Хэдли Уикхема, пытаясь решить упражнение 2 из раздела 2.3.6 о копировании при изменении:

Объясните, почему tracemem() показывает две копии при запуске этого кода. Подсказка: внимательно посмотрите на разницу между этим кодом и кодом, показанным ранее в разделе.

x <- c(1L, 2L, 3L)
tracemem(x)

x[[3]] <- 4

(предыдущий код изменил один элемент в списке дубликатов на другой дублик, получив только одну копию.)

В Advanced R Solutions Гроссера и Бумана они объясняют , что вторая копия происходит из-за приведения типов, от целого числа до двойного. Они не определяют x как c(1L, 2L, 3L), но используют x <- 1:3, что, на мой взгляд, было эквивалентно (сравнение их с использованием identical также возвращает TRUE). Однако выполнение приведенного выше кода (с моей стороны) дает только одну копию, а выполнение следующего кода дает две копии:

x <- 1:3
tracemem(x)

x[[3]] <- 4

Запуск этого кода также дает две копии:

x <- c(1L, 2L, 3L)
typeof(x)
tracemem(x)

x[[3]] <- 4

Например, замена typeof на class дает только одну копию, а замена mode или pryr::otype - две копии. Но простая печать x вместо этого дает одну копию.

Так в чем же разница между c(1L, 2L, 3L) и 1:3, и почему вызов некоторых, но не всех вышеперечисленных функций изменяет поведение?

Я получаю то же поведение при запуске кода из PowerShell, используя Rterm и в консоли в RStudio.

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