Rで変数名を半自動的に生成する方法

先週、あるところでプログラミングの話をしていて、「変数名を半自動的に生成して、それにデータを入れることはあるのか」と聞かれたので、ここに書いておきます(以下、GNU R限定して話を進めますが、他のプログラム言語でも同じことが可能なはずです(そのプログラムに詳しい人に聞いてみてください))。

で、回答は「あるよ」なんですが:

プログラムをしていると「データが2つ(例えばデータA, データB)あって、それぞれのデータを2つの変数(例えばtmp1, tmp2)に入れたいな」というようなことはよくあります。

統計解析環境 GNU Rだと以下のように書きます。


tmp1 <- data1
tmp2 <- data2
うん、簡単ですね。

しかし、「将来的にはもう一つ新しいデータ(例えばデータC)が加わるんだけど、その時に新しい変数(例えばtmp3)に加えるってプログラムを追加するのは面倒だなぁ」と思うことも良くあります。で、面倒なのでできればデータが増えたら、自動的に変数も増えてくれるようなプログラムを書いておきたい・・・でもそれはちょっと難しくなります。

変数tmp1には1から5までの数字、tmp2には6から10までの数字が入るようなプログラムを書きます。


ary <- array(1:15, c(5,3))
for( j in 1:3){
eval(parse(text=paste("tmp",j,"<-ary[,",j,"]",sep="")))
}
もし、将来、tmp3には11から15までの数字が入るようにしたければ、"for( j in 1:2)"の部分を"for( j in 1:3)"とすれば自動的に変数tmp3が生成されます。

さらに応用問題:変数名をri, rj, rkにしたい場合は以下のようにします。


ary <- array(1:15, c(5,3))
nmlst <- list("ri", "rj", "rk")
for( j in 1:3){
eval(parse(text=paste(nmlst[j],"<-ary[,",j,"]",sep="")))
}
ネタ元はRjpWikiにあります。

一見すると非常に面倒なように見えますが、慣れの問題ですので、こういったテクニックに興味のある人は覚えておくと良いと思います。