R 中是否有 "move" 命令(相当于 <- 后跟 rm)?



这是其中一个"必须有一个函数来解决这个问题"的问题。这没什么大不了的,但它已经够烦人的了,每次我重命名一个对象时,我都想知道是否有更好的方法。

假设我将创建的对象大写,并意识到我宁愿将其非大写:

# Create test data
X <- runif(100)
# Rename the object
x <- X
rm(X)

是否有一种单一的命令方式(也可以避免由于内存/速度原因而进行的重新复制)?在各种包中有一些名为rename的命令,但它们都适用于列表中的元素,而不是列表(或其他对象)本身。

我不知道有什么内置的方法可以做到这一点,但您可以很容易地编写自己的函数来完成这些操作。例如,这只是在没有任何检查以确保对象存在,或者是否已经有一个对象命名为您想要重命名的对象的情况下完成的

mv <- function(x, y){
    x_name <- deparse(substitute(x))
    y_name <- deparse(substitute(y))
    assign(y_name, x, pos = 1)
    rm(list = x_name, pos = 1)
    invisible()
}

一些示例使用

> x <- 3
> x
[1] 3
> y
Error: object 'y' not found
> mv(x, y)
> x
Error: object 'x' not found
> y
[1] 3

编辑:对于那些没有关注评论中链接的人,这里有一个由Rolf Turner编写的版本,它会进行一些检查,以确保我们想要移动的对象确实存在,并询问我们如果新名称中已经有对象,是否要覆盖现有对象。

mv <- function (a, b) {
    anm <- deparse(substitute(a))
    bnm <- deparse(substitute(b))
    if (!exists(anm,where=1,inherits=FALSE))
        stop(paste(anm, "does not exist.n"))
    if (exists(bnm,where=1,inherits=FALSE)) {
        ans <- readline(paste("Overwrite ", bnm, "? (y/n) ", sep = ""))
        if (ans != "y")
            return(invisible())
    }
    assign(bnm, a, pos = 1)
    rm(list = anm, pos = 1)
    invisible()
}

相关内容

最新更新