forループで変数名のリストを生成し、それらに値を割り当てます


27

forループを使用して変数のリストを作成し、その値を与える簡単な方法があるのだろうか。

for(i in 1:3)
{
  noquote(paste("a",i,sep=""))=i
}

上記のコードでは、私が作成しようとa1a2a3ただし、Rは、エラーメッセージを表示します1、2、3の値にどの割り当てます。ご協力いただきありがとうございます。


3
私はあなたがこれをしなければならないことを疑います-あなたは非常に間違った方法で何かを作っているようです。

@mbq、たとえばEviewsでは、これはごく普通のコーディング手法です。私がそれを提唱しているわけではありません。Eviewsの評価は、私のトップの邪悪なソフトウェアリストでExcelより少し低いだけです:)
mpiktas

6
@mpiktas Rでは、リストを作成し、そのnamesパラメーターを設定し、後でそれを使用するか、attachそれを使用するか、またはlist2envそのeval内部および内部の環境に変換する方が自然です。ループ、解析、その他のいものはありません。

@ mbq、hm list2envは比較的新しい関数です。そして、OPが最上位の環境で変数を取得したい場合、それでもいくつかの環境で変数を生成します。だからさはまだ残っている:)
mpiktas

2
同様の性質の将来の質問については、この種の質問が実際にStackOverflowに属することをお勧めします。質問自体は統計とは関係ありません。
火星

回答:


41

あなたが探していassign()ます。

for(i in 1:3){
  assign(paste("a", i, sep = ""), i)    
}

与える

> ls()
[1] "a1"          "a2"          "a3" 

そして

> a1
[1] 1
> a2
[1] 2
> a3
[1] 3

更新

ループを使用することは(非常に頻繁に)悪いRコーディングスタイルであることに同意します(上記の説明を参照)。list2env()(言及してくれた@mbqに感謝)を使用して、これは@Han Lin Shangの質問に対する別の解決策です。

x <- as.list(rnorm(10000))
names(x) <- paste("a", 1:length(x), sep = "")
list2env(x , envir = .GlobalEnv)

21

値がベクトル内にある場合、ループは不要です。

vals <- rnorm(3)
n    <- length(vals)
lhs  <- paste("a",    1:n,     sep="")
rhs  <- paste("vals[",1:n,"]", sep="")
eq   <- paste(paste(lhs, rhs, sep="<-"), collapse=";")
eval(parse(text=eq))

補足として、これがRが好きな理由です。


4
library(fortunes) fortune(106)
ローマンルシュトリック

@Roman、奇妙なことに、parseRのヘルプページを読んでから使い始めました。私は時々、例えばformula管理においてはやり過ぎであることに同意しますが、非常に便利だと感じました。私はそれを尋ねなかったので、私は幸運で示唆されたように質問を再考できないことに注意してください。
mpiktas

1
@mpiktas:基になるスコープルールが関数内で使用されたときに予測できない結果になる可能性があるという事実に関係しています。また(ヘルプファイルに記載されているように)、スコープ規則の違いにより、RとSは異なる結果を与える可能性があります。また、他のソリューションよりも低速です。これは、これを何度も行う必要がある場合に重要になります。最後に重要なことですが、ほとんどの場合、eval(parse())を使用するよりもエレガントで簡単なソリューションがあります。この場合、リストを使用するか、割り当てを使用します。
ジョリスメイズ

1
@mpiktas:それが不足していると言ったことはありません。一般的に、Rコア開発チームのメンバーであるThomas Lumleyがeval(parse())コンストラクトを推奨する理由を説明しました。(cfr @Roman Lustrikの言及)
13:06

1
正確に、assignを使用して複数の単一要素変数を作成するなどの悪い習慣は推奨されません
-mdsumner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.