R, глубокие и мелкие копии, проходят по ссылке


Я хотел бы понять логику, которую использует R при передаче аргументов функциям, создании копий переменных и т. д. что касается использования памяти. Когда он фактически создает копию переменной, а не просто передает ссылку на эту переменную? В частности, меня интересуют следующие ситуации:

f <- function(x) {x+1}
a <- 1
f(a)

Передается ли a буквально или это ссылка на передаваемое?

x <- 1
y <- x

Ссылка на копию? Когда же это не так?

Если бы кто-нибудь мог объясните мне это, я был бы очень признателен.

1 16

1 ответ:

Когда он передает переменные, он всегда копируется, а не по ссылке. Иногда, однако, вы не получите копию, сделанную до тех пор, пока назначение не произойдет на самом деле. Реальное описание процесса-это обещание пройти мимо. Взгляните на документацию

?force
?delayedAssign
Один практический вывод состоит в том, что очень трудно, если не невозможно, избежать необходимости по крайней мере в два раза больше оперативной памяти, чем ваши объекты номинально занимают. Изменение большого объекта обычно требует создания временного копировать. Обновление: 2015: я согласен (и согласился) с Мэттом Доулом, что его данные.пакет таблицы предоставляет альтернативный маршрут к назначению, который позволяет избежать проблемы копирования-дублирования. Если это было запрошенное обновление, то я не понял его в то время, когда было сделано предложение.

Недавно в R 3.2.1 были внесены изменения в правила оценки для apply и Reduce. Это было так-объявлено со ссылкой на новости здесь: возвращение анонимных функций из lapply-что происходит неправильно?

И интересная статья, цитируемая джетцелем в комментариях, теперь здесь :