・お題:for文やwhile文を使って、繰り返し処理をしてみたい。
・for文を使ってみる。1から10まで足し算することを考える。Pythonで書くとこんな感じ。rangeはわざわざリスト化する必要はないけれど、Rと似たような感じにしたくてリストにしてみた。list(range(1,11))は[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]になる。
m=0
for n in list(range(1,11)):
m=m+n
print(m)
これで、55が返ってくる。
・RStudioでforと打つと、候補が勝手に出てきてくれた。これはとても便利。
・variableのところに変数を、vectorのところにベクトルを放り込めば何とかなりそう。続きを書くとこんな感じ。forの後を()で包んで、そのあとの処理を{}で包む感じ。1:10は
1 2 3 4 5 6 7 8 9 10になってる。
> m<-0
> for (n in 1:10) {
+ m<- m + n
+ }
> m
[1] 55
・Pythonでいうzipはどうなるか。複数のイテラブルなオブジェクトから要素を順番にセットで抜き出して変数に格納してくれるのがzip。
a=[1,2,3,4,5]
b=[6,7,8,9,10]
c=[]
for m,n in zip(a,b):
c.append(m*n)
print(c)
で[6, 14, 24, 36, 50]が返ってくる。
・似たようなことをRでやってみると、以下のような感じ?
> a<-c(1,2,3,4,5)
> b<-c(6,7,8,9,10)
> c<-mapply(function(m, n) m*n, a, b)
> c
[1] 6 14 24 36 50
・mapplyはmapply(function, vector, vector, vector,...)みたいな感じで使うっぽい。vectorはlistでも別に良いので、イテラブルなオブジェクトならOKっぽい(Rでの呼び方はこれであっているのか?)。取り出した要素を掛け算するだけだけれど、今回はあえてfunction関数で処理を定義する。
・function関数は、直後の()内で変数を指定し、そのあとに処理を記述する。無名関数を使ったり、functionをオブジェクトにしてmapply関数の第1引数として放り込む方が見やすいと思うけれど、今回はPythonの先の例に似たような感じで書いてみた。
・次に、while文を試してみる。1から5まで整数を書き出すことを考える。処理が終わったら、Fin.を打ち出してほしい。Pythonで書くと以下の感じ。
n = 1
while n <= 5:
print(n)
n=n+1
print("Fin.")
これで以下が出力される。
1
2
3
4
5
Fin.
・Rでも同様に記述してみる。こんな感じだろうか。
> n<-1
> while (n<=5) {
+ print(n)
+ n=n+1
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
> print("Fin.")
[1] "Fin."
おわり。