2

私は、R の専門家はループがあまり好きではないという結論に達しました。ただし、この真実は、元 Java プログラマーとしての私には少し厳しいものです。

x1、、、、の 5 つの変数を動的に作成しx2、それぞれx3にランダムな値を割り当てますx4x5

> i = 1
> 
> while(i <= 5)
 {
   assign(paste("x", i, sep = ""), rnorm(1))
   i = i + 1       
 }
> x1
[1] 0.3853609
> x2
[1] 1.626055
> x3
[1] -1.043699
> x4
[1] 0.3449921
> x5
[1] -0.9768416

さて、これはwhileループを使用しており、これを行う R の方法を探しています。私は試した:

assign(paste("x", 1:5, sep=""), rnorm(1)

エラーが発生します。私は何を間違っていますか?

4

4 に答える 4

10

R はベクトル化されます。ただやって..

x <- rnorm(5)
[1] -1.285847248  0.285534550  0.001136893  0.167311756 -1.420379168

を使用して各要素にアクセスし[ます (リストは[[関数を使用してリスト要素をサブセット化します)。5番目の値を取得するには...

x[5]
[1] -1.420379

これは基本的な R 機能です。タグ wikiのR 情報ページにあるチュートリアルを読むことをお勧めします。

于 2013-08-09T09:40:45.280 に答える
3

ループを使用しない方がループを使用するよりもルーピーな場合があります。

parseは複数の式を処理するので、それを使用しないのはなぜですか? 割り当て呼び出しのベクトルを構築し、それらを使用します。

> i=1:5
> s=paste("x",i,"<-rnorm(1)",sep="")
> eval(parse(text=s))
> ls()
[1] "i"  "s"  "x1" "x2" "x3" "x4" "x5"
> x1
[1] -0.6467902
> x2
[1] 1.376682

しかし、この種のことは実際のコードにはありません。例を教えるために変数を生成する際に舞台裏で使用したいかもしれませんが、ピートのためにこれを子供たちに見せないでください!

于 2013-08-09T10:29:54.963 に答える
2

関数がベクトル化されていない場合に明示的なループを回避するには、適用型の関数を使用できます。次に例を示します。

sapply(1:5, function(i){assign(paste("x", i, sep = ""), rnorm(1), pos = 1)})

または を使用して関数をベクトル化しますVectorize。次に例を示します。

assign.vect <- Vectorize(assign, vectorize.args = c("x","value"))
assign.vect(paste("x", 1:5, sep=""), rnorm(5), pos = 1)
于 2013-08-09T10:08:32.743 に答える