web-dev-qa-db-ja.com

その場で変数に名前を付ける方法は?

その場で新しい変数名を作成することは可能ですか?

リストからデータフレームを読み取って、最後に数字が付いた新しい変数にしたいと思います。 orca1、orca2、orca3のようなもの...

私のようなものを試してみると

paste("orca",i,sep="")=list_name[[i]]

このエラーが表示されます

target of assignment expands to non-language object

これを回避する別の方法はありますか?

86
Maiasaura

assignを使用:

assign(paste("orca", i, sep = ""), list_name[[i]])
108
Shane

orca1orca2などを使用するよりも、リストを使用した方がよいと思われる... ... orca[1]orca[2]、...

通常は、数字だけで区別される変数のリストを作成します。その数字は、後でそれらにアクセスするための便利な方法だからです。

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

それ以外の場合、assignはまさにあなたが望むものです。

32
John

データフレームを作成しないでください。リストを保持し、要素に名前を付けますが、添付しないでください。

これの最大の理由は、外出先で変数を作成する場合、ほとんどの場合、後で何か有用なことを実行するために各変数を反復処理する必要があるためです。そこで、その場で作成した名前のそれぞれを繰り返し処理する必要があります。

リストの要素に名前を付けて、名前を反復処理する方がはるかに簡単です。

Attachに関して言えば、Rでのプログラミングは本当に悪い習慣であり、注意しないと多くのトラブルにつながる可能性があります。

9
sidquanto

よくある質問:

あなたが持っている場合

varname <- c("a", "b", "d")

できるよ

get(varname[1]) + 2

for

a + 2

または

assign(varname[1], 2 + 2)

for

a <- 2 + 2

したがって、変数(連結など)を使用する式を評価する場合はGETを使用し、事前宣言された変数に値を割り当てる場合はASSIGNを使用するように見えます。

assign:assign(x、value)の構文

x:文字列として与えられた変数名。強制は行われず、長さが1より大きい文字ベクトルの最初の要素が使用されますが、警告が表示されます。

value:xに割り当てられる値。

2
Mox

別のトリッキーな解決策は、リストの要素に名前を付け、attach it:

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa
0
Marek