こんにちは、VOYAGE GROUPの水越(@Akiyah)です。
いま話題のFizzBuzz問題をデータ解析環境「R」で書いてみました。

メインの参考ページはここです。
FizzBuzz問題を使って社内プログラミングコンテストを開催してみた - ITは芸術だ
仕様
・1から順番に数をコマンドプロンプト/ターミナルに表示する。
・その数が3で割り切れるなら"Fizz“
・5で割り切れるなら"Buzz“
・両方で割り切れるなら"FizzBuzz"と表示する。
まずは上記のページで紹介されているperl版をほぼそのままRに移植してみます。
args <- commandArgs()
endval <- args[6]

for (i in 1:endval) {
    fizz = i %% 3
    buzz = i %% 5

    if (fizz == 0 && buzz == 0) {
        cat("FizzBuzz")
    }
    else if (fizz == 0) {
        cat("Fizz")
    }
    else if (buzz == 0) {
        cat("Buzz")
    }
    else {
        cat(i)
    }
    cat("\n")
}
Rというなじみのない言語ですが、コードはいたって普通ですね。<-は代入で、catは画面表示する関数です。
このファイルをfizzbuzz.rというファイルに保存して、Rscriptコマンドで実行します。(この記事書くまでRファイルをコマンドラインから実行する方法を知りませんでした! Rでは環境に入って作業するのが普通なのです。)
$ Rscript fizzbuzz.r 20
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
もとのperl版からほとんど変えずに動きました。よかったよかった。
さて、Rらしく変更してみます。
args <- commandArgs()
endval <- args[6] i <- 1:endval x <- i x[i%%3==0] <- "Fizz" x[i%%5==0] <- "Buzz" x[i%%3==0 & i%%5==0] <- "FizzBuzz" cat(paste(x, collapse="\n")) cat("\n")
だいぶ短くなりましたね。実行結果はまったく同じです。
ちょっと解説しますね。Rのベクトル(配列みたいなものです)はまとめて演算したり、条件を判断して新しいベクトルを作ることができます。下記はRコマンドでRの実行環境に移動して試しています。
> i <- 1:20
> i
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
> i%%3
 [1] 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2
> i%%3==0
 [1] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
[13] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE
そしてベクトルの[ ](インデックス)にベクトルを入れたり、それをつかって<-でまとめて値を変更したりできるのです。
> x <- 1:20
> x[i%%3==0]
[1]  3  6  9 12 15 18
> x[i%%3==0] <- "Fizz"
> x
 [1] "1"    "2"    "Fizz" "4"    "5"    "Fizz" "7"    "8"    "Fizz" "10"  
[11] "11"   "Fizz" "13"   "14"   "Fizz" "16"   "17"   "Fizz" "19"   "20"  
このベクトル操作を利用して、ベクトルの3、5、15の倍数の時の値を変更したのです。実は『
FizzBuzz R』で検索するとたくさん見つかって、R業界ではFizzBuzz問題は有名みたいです。上に書いた例と同様のコードも見つかりました。考えてみると、FizzBuzz問題はRの得意分野なんですよね。

参考
The R Project for Statistical Computing
FizzBuzz問題を使って社内プログラミングコンテストを開催してみた - ITは芸術だ
FizzBuzz問題をJavaScriptで - jsdo.it - Share JavaScript, HTML5 and CSS
Fizz-Buzz問題 初級Q&A アーカイブ(7) - RjpWiki