我读了这个关于重命名对象的基本问题和@Shane 的回答,指出我懒惰的评估。现在我想知道是否assign
也懒惰地评估。就像这里:
assign("someNewName",someOldObject)
rm(someOldObject)
我对此感到疑惑的原因是以下用例:假设我有 10K+ R 个对象,每个对象都有两个名为originalName
and的属性additionalName
。现在我想编写一个函数,可以有效地让用户从一个名称切换到另一个名称,而不会丢失这两个属性。大概是这样...
编辑:根据@Hadley 的输入,我更改了我的代码。
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)
.