Каждое назначение означает, что копия делается? - PullRequest
2 голосов
/ 16 апреля 2019

Недавно я узнал, что в 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 нет ссылок», поэтому этот вопрос основан на моих переживаниях из-за того, что может быть следствием этого отсутствия ссылок, а не из каких-либо эмпирических наблюдений.

1 Ответ

0 голосов
/ 16 апреля 2019

Дональд Кнут сказал, что «преждевременная оптимизация - корень всего зла»,

http://wiki.c2.com/?PrematureOptimization

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

...