Недавно я узнал, что в R нет ссылок, скорее все объекты неизменны и каждое назначение делает копию.
О-оу.
Копирование больших матриц снова и снова кажется довольно ужасным ...
Сейчас я нахожусь в паранойе, копирую код все время, потому что боюсь делать вспомогательные функции (передача параметров = присваивание? Возвращаемые значения = присваивание?), Боюсь создавать вспомогательные переменные, если я не уверен на 100%, что объект все равно будет скопирован ...
Пример:
Что бы я хотел сделать:
foo = function(someGivenLargeObject) {
returnedMatrix = someGivenLargeObject$someLargeMatrix # <- BAD?!?!?!?!
if(someCondition)
returnedMatrix = operateOn(returnedMatrix)
if(otherCondition)
returnedMatrix = operateOn(returnedMatrix)
returnedMatrix
}
Что я делаю вместо этого:
foo = function(someGivenLargeObject) { # <- still BAD?!?!?!
returnedMatrix = NULL # <- No copy of someLargeMatrix is made!
if(someCondition)
returnedMatrix = operateOn(someGivenLargeObject$someLargeMatrix)
if(otherCondition)
returnedMatrix = operateOn(
if(is.null(returnedMatrix))
someGivenLargeObject$someLargeMatrix
else
returnedMatrix
) # <- ^ Incredible clutter! Unreadable!
if(is.null(returnedMatrix))
return(someGivenLargeObject$someLargeMatrix)
else
return(returnedMatrix) # <- does return copy stuff?!?!?!?!
Потеря читабельности во второй версии функции довольно удивительна для ИМО; все же - это цена, чтобы избежать ненужного копирования someLargeMatrix
в случае, если ни someCondition
, ни otherCondition
не выполняется? Поскольку строка returnedMatrix = someGivenLargeObject$someLargeMatrix
потребует этого копирования?
Или я в паранойе, могу ли я спокойно перейти на более читаемую версию функции, потому что ссылка на someLargeMatrix
не требует копирования? (НО НЕТ ССЫЛКИ В R !!!)
Также я надеюсь, что вызов функции / возврат функции тоже не копирует?
}
Примечание: просто, чтобы было ясно: я еще не столкнулся с проблемой, когда знал , что объект был скопирован без необходимости в ситуации, подобной описанной выше. Я просто сбит с толку, прочитав, что «в R нет ссылок», поэтому этот вопрос основан на моих переживаниях из-за того, что может быть следствием этого отсутствия ссылок, а не из каких-либо эмпирических наблюдений.