Я читаю 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.