4

これは、「これには関数が必要です」という質問の 1 つです。大したことではありませんが、オブジェクトの名前を変更するたびに、もっと良い方法があるのではないかと思うほど面倒です。

私が作成したオブジェクトを大文字にし、それを大文字にしないほうがよいことに気付いたとします。

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

これを行う 1 つのコマンドの方法はありますか (これにより、メモリ/速度の理由で再コピーも回避されます)。さまざまなパッケージで名前が付けられたいくつかのコマンドがありrenameますが、それらはすべて、リスト (または他のオブジェクト) 自体ではなく、リスト内の要素に対して機能します。

4

1 に答える 1

3

これを行う組み込みの方法はわかりませんが、これらの行に沿って何かを行う独自の関数を簡単に作成できます。たとえば、これは、オブジェクトが存在すること、または名前を変更したい名前のオブジェクトが既に存在するかどうかを確認することなく、それを行います。

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 によって書かれたバージョンがあります。これは、移動したいオブジェクトが実際に存在することを確認し、既存のオブジェクトを上書きするかどうかを尋ねます。 new name にはすでにオブジェクトが含まれています。

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()
}
于 2012-07-13T18:32:23.270 に答える