Я пытаюсь лучше понять управление памятью R и идею «копировать при модификации». С веб-сайта Advance R Хедли Уикхэма (https://adv -r.hadley.nz / names-values.html ) кажется, что, как только векторный объект был скопирован для модификации, дальнейшие модификации не должны требовать копия:
# From Hadley's website, not my computer
x <- c(1, 2, 3)
cat(tracemem(x), "\n")
#> <0x7f80c0e0ffc8>
y <- x
y[[3]] <- 4L
#> tracemem[0x7f80c0e0ffc8 -> 0x7f80c4427f40]:
y[[3]] <- 5L
# No copy
Однако, когда я действительно запускаю это на своем компьютере с Windows, я вижу вторую копию из tracemem:
# Run on my windows desktop
x <- c(1, 2, 3)
cat(tracemem(x), "\n")
#> <000002089596EBB8>
y <- x
y[[3]] <- 4L
#> tracemem[0x000002089596ebb8 -> 0x00000208960323d0]:
y[[3]] <- 5L
#> tracemem[0x00000208960323d0 -> 0x00000208961ba540]:
Далее, узнав об идее об объекте NAM ( Действительно ли данные копируются четыре раза в функции замены R? ), я обнаружил, что даже недавно созданные векторы в новом сеансе R являются NAM (3 ), хотя я и ожидал NAM (1)
x <- c(1, 2, 3)
.Internal(inspect(x))
# 0x0000022abc9e4998 14 REALSXP g0c3 [NAM(3)] (len=3, tl=0) 1,2,3
Кто-нибудь еще испытывает это? Моя сессияInfo ниже.
R версия 3.5.3 (2019-03-11) Платформа: x86_64-w64-mingw32 / x64 (64-разрядная версия)
Работает под: Windows 10 x64 (сборка 16299)
Матричные продукты: по умолчанию
языковой стандарт: [1] LC_COLLATE = English_United States.1252
LC_CTYPE = English_United States.1252 LC_MONETARY = English_United
States.1252 [4] LC_NUMERIC = C
LC_TIME = English_United States.1252
прикрепленные базовые пакеты: [1] stats graphics grDevices utils
база методов наборов данных
загружено через пространство имен (и не подключено): [1] compiler_3.5.3
tools_3.5.3
Кроме того, у меня есть доступ к машине Linux с R 3.5.1. На этой машине я не получаю вторую копию памяти, но все еще вижу, что новые векторы - это NAM (3).