Я прочитал this basic question о переименовании объектов и ответе @Shane на него, указывая на ленивую оценку. Теперь мне интересно, оценивается ли assign
лениво. Так же, как здесь:Ленивая оценка в R - назначается пострадавшим?
assign("someNewName",someOldObject)
rm(someOldObject)
Причина, почему мне интересно об этом заключается в следующем использования: Предположим, я получил объекты 10K + R, каждый из которых имеет два атрибута, называемых originalName
и additionalName
. Теперь я хочу написать функцию, которая может позволить пользователю переключиться с одного имени на другое без потери этих двух атрибутов. Примерно так ...
EDIT: на основании ввода Хэдли я изменил свой код.
switchObjectName <- function(x) {
n1 <- attributes(x)$originalName
n2 <- attributes(x)$additionalName
objName <- deparse(substitute(x))
if(objName == n1) {
delayedAssign(n2,x,assign.env=.GlobalEnv)
} else {
delayedAssign(n1,x,assign.env=.GlobalEnv)
}
rm(list=c(objName),envir=.GlobalEnv)
}
это работает хорошо, но у меня было довольно много проблем, чтобы получить право rm
заявления. Я попробовал rm(objName,envir=.GlobalEnv)
, но не смог заставить его работать, хотя objName определенно является символом, потому что это результат deparse(substitute(x)
.
Если я правильно понял ваш вопрос, см. «DelayedAssign», https://github.com/hadley/pryr/blob/master/R/assign-delayed.r и раздел «Назначение: привязка имен к значениям» на https://github.com/hadley/devtools/wiki/environments – hadley
еще раз спасибо. особенно, что указатель на главу в вашей вики помог мне понять, что происходит на самом деле. 'delayedAssign' был правильным намеком. –