この記事では R プログラミングの基礎を学習します。今回の目標はプログラミングの基礎の練習としてよく使われる素数判定をする関数を作ることとします。R初心者の方に向けて基本的な関数や文法を一通りオンラインでチュートリアル形式でで実践できるのでリアルに R の記述の仕方を知っていただけます。
Contents
1. プログラミングとは
機械は 0 と 1 の数字の並びによって動くため人間の言語の指示では動かすことができません。そこで機械と人間を繋ぐのがプログラミング言語です(細かく言うとさらにいろんなものがあるが…)。ある決まりによってプログラミング言語で命令を記述し、命令を設計することがプログラミングでありこれによって機械を自由に扱うことができます。
2. R言語とは
プログラミング言語で有名なものではおそらく Python や C、Java などがあると思います。それぞれ何のために使うかによって使用する言語が分かれてきますが R は統計処理やデータ処理を行う時によく利用されます。データサイエンティストに人気がある言語です。データサイエンスで用いられる言語はPython、R、SQLなどがあります。
Python であると様々なライブラリ(NumPy、Pandas、matplotlib…)を用いて処理を行いますがそれぞれ使い方を学ぶので時間がかかります。一方、R でも統計処理のライブラリは多く存在しますが、最初からある基本的な操作で簡単に記述できる特徴があります。Python ほどの汎用性はありませんがこのような理由でデータサイエンティストに人気があります。
他には、エクセルなどでデータ処理やグラフ作成を行うよりも様々な機能があるのできれいなグラフを書いたりすることができます。(Pythonでもできますが…)
以上R言語の特徴でした。では早速基礎の基礎からプログラミングをしてみましょう。
3. 基本的な表示と計算
3.1 表示方法
下に黒い背景で code が書かれたセルがあると思います。この code が書かれた場所はエディタといい自由に code を書くことができます。色が変わってくれることで命令ごとに分かれて見えるので見やすいと思います。code を実行する時は左下の再生ボタンを押します。自分で少し code を変えてみて実行してみたりすると理解しやすいと思います。隣は code をコピーできます。丸い矢印は結果を初期化してくれます。右下の<>を押すと書き換える前の元の code が表示されます。
では下の code を実行してみましょう。
“Hello World”, 45, と表示できたと思います(その下に 4 が出ますが一番最後の結果を表示するようです)。プログラムは上から順に実行されます。
print() の () の中に好きなことを入れることで表示することができます。文字を入力するときは ”” で囲む必要があります。数字を表示するときはそのままでいいです。print 文は変数の中身など途中の結果を確認するときによく使います。好きなな内容を入れて表示させてみましょう。
表示させたいものが文字だけ、数字だけとかではなく両方合わせて表示したいとします。Pythonであれば print 文で書けますが、R では次のように書きます。
上のように C 言語の printf 文のように書けます。文字列の中で “%i” や “%.3f” のように書くことで二つ目の引数を文字に入れることができます。i は int 型 (整数型), f は float 型(浮動小数点数型)であり “.” をつけることで表示する小数点以下の桁数を変えることができます。他にも文字列と数字をくっつけて文字列として同時に表示する関数としてpaste 関数があります。説明では見やすいようにpaste 関数を使って表示していきます。
3.2 数値代入と四則演算
次に数値代入と簡単な数値計算を行なっていきます。下のセルを実行して x に 15、y に 8 を代入してみましょう。結果は先ほどの print 文で表示しています。
これは R の特徴ですが代入の記号が “<-“ で表されます。( “=” でもできる時がありますが数値代入では使わない方が良いです。)
次に四則演算をします。
このように簡単な計算できます。以下に記号をまとめました。
加算(足し算) | + |
減算(引き算) | – |
乗算(掛け算) | * |
徐算(割り算) | / |
整数の範囲の徐算 商 | %/% |
整数の範囲の徐算 あまり | %% |
べき乗 | ^ |
多少他の言語と違うもののだいたい同じ記号で計算することができます。これらを使って長い計算もできます。数学と同じように()でくくると先に計算されます。値を変えたり式を変えたりして計算機として使えます。
3.3 その他の数学的な計算
四則演算まで R でプログラムを書き計算できました。その他の数学的な計算を紹介します。
このように書くことで数学でよく用いられる関数の計算もすることができます。これらは一例であり他にも様々な関数の計算が外部ライブラリを用いずに使用することができます。
3.4 比較演算子
数値の大小関係を用いて条件を設定したりするときに比較演算子を使います。使う感覚は数学と同じだと思っていいと思います。
結果はTRUEとFALSEで出ました。これは真偽値といい TRUE が “正しい” 、FALSE が “不適” を示しています。またこれを数値化すると TRUE が 1 、FALSE が 0 を示します。
4. ベクトル
ここではデータの構造の一つであるベクトルを扱いたいと思います。データ構造には他にも行列や配列があります。今回は一番簡単なベクトルについて説明します。これまでは一つの変数で一つの文字列や数字しか扱えませんでした。しかし同時に複数のデータを扱いたいときがあります。例えばある人の情報である身長、体重、年齢など一人に対して複数のデータがあるようなとき、ベクトルであればこの人一人に対しての変数が一つで表現できます。
ベクトルの定義の仕方はこのように書きます。
"変数" <- c("ベクトルの要素")
しかし、要素には人つの型しか入れることができません。数字と文字を要素に含むときは数字が文字に変換されてしまいます。ベクトルの定義では seq を使うことで他にも連続的な数を定義したりすることができます。
ベクトルの要素を取得したい場合やベクトルの長さを取得したい場合、要素を追加、消去したりしたい場合は次のように書きます。ベクトルの要素についての番号は前からスタートが 1 となっています。Pythonでは 0 がスタートとなっているためここは大きく異なります。
5. ループ
例えば 1 から 5 までの階乗(1×2×3×4×5)を求めたいとしましょう。
x <- 1 x <- x * 2 x <- x * 3 x <- x * 4 x <- x * 5 print(x)
または
x <- 1*2*3*4*5 print(x)
今までの範囲でできるのはこのように書くでしょう。これぐらいの計算ならばそれほど労力がかからないと思いますがこれが 100 までの階乗とかであるととても長い code になってしまいます。
そこでこのような繰り返し処理を行う場合、for 文や while 文を使います。
5.1 for 文
まず for 文を使って先ほどの 5 の階乗を求めることをしていきます。
正く計算できていますね。このように繰り返し処理をする場合 for 文を使うと良いです。
具体的な書き方について説明します。全体的な構造は
for ( "変数" in "繰り返す範囲" ){ "処理内容" }
となっています。
() の中で繰り返す変数を設定してその変数に繰り返す範囲で変数に代入していきます。設定した変数は処理内容の中で使えます。今回の”変数”は i を変数としています。”繰り返す範囲” は i に入れていく値であり、1:5 とすると 1~5 までの数列が生成され i に代入されます。”繰り返す範囲”はベクトルの形でも値を渡すことができます。
変数は基本的にはなんでも良いですが多く使われるのが i, k, n, j などです。(数学よく使われる変数です。)
5.2 while 文
次に紹介するのが while 文です。for 文では繰り返す回数が代入する変数の範囲で決められましたが今回は条件で繰り返し回数を指定します。同じ 5 の階乗について while 文を使って書いてみます。
while 文でも計算できました。while 文の構造は
while("繰り返し条件"){ "処理内容" }
while 文の場合”繰り返し条件”がTRUEであればずっと繰り返されます。
6. 条件分岐
条件分岐は if 文を使って記述します。if 文を使うことである条件を満たす時だけ実行する処理をおこなうことができます。条件には 3.4 で説明した比較演算や真偽値を使います。例えば次のような code があります。これはテストの点数で成績を振り分けます。90点以上で AA、80点以上で A、70点以上で B、60点以上で C、60点以下は落第という成績です。
テストの点数が 80点の時 Aの成績が出力されました。では具体的な文法について説明します。
if ("条件1"){"実行内容"}
これが基本内容です。この場合条件1 を満たさなければ結果は何も出力されません。条件1 を満たさない場合全て同じ処理をする場合は次のようになります。
if("条件1"){ "実行内容1" }esle{ "実行内容2" }
先ほどのように他の複雑な条件をつけたい場合は “else if” を使うことで指定できます。else if を使う場合は条件を指定する必要があります。
7. 関数
プログラムを書いているとこれまで書いてきたプログラムを何度も使いたい時があります。例えば5.条件分岐で成績を表示するプログラムを書きましたが他の試験の点数でも使いたいとします。何度も上のcode を書くのはめんどくさいですよね。そんなとき先ほどのプログラムを関数とします。
このように書くと一番下で書かれているように自分で作った test_grade という関数を使うことができます。一度定義した関数は新しい関数を定義するときに使用することもできます。print も元々定義されている関数であり test_grade のなかで使うことができます。書き方はこのようになります。
"定義する関数の名前" <- function( "関数を使うときの入力となる変数" ){ "処理内容" }
入力したい変(数今回はテストの点数)複数ある場合は x だけでなくy や z などいくつも定義します。処理内容には“関数を使うときの入力となる変数”で定めた変数(x や y など)を対応させて書きます。
また値を返してほしいときに使う場合 “return” を使って返す値を指定指定します。
入れた値から5を引く関数を作りました。”return”で値を返すことで y に関数に x を入れた結果を代入することができます。
8. 総合問題
これまで基本的なプログラミングをR言語を使って行ってきました。これらを使ってある整数が素数か判定する関数をを作って見ましょう。また、作った関数を使ってある整数までに含まれる素数の要素を出力する関数を作ってみましょう。
8.1 素数判定関数
まず素数とは1とその数自身でしか割れない数です。なので 2 から始めて順番に割っていき、その数の 1つ前の数字までで割り切れなければ素数です。for 文を使えば順番に割って、素数の判定を繰り返すことができます。また、素数の判定はあまりが 0 かどうかです。これは if 文を使うと書けそうです。あまりが 0 の場合は素数ではない FALSE を返し、あまりが 0 となることがなかった場合のみ TRUE を返します。
for 文は 1からその数の一個前まででしたがその数の半分までの数で割り、そこで割ることができれば残りの半分に必ずその商が現れるので半分までを調べれば良いことがわかります。奇数のときは真ん中の数まで調べなくてはならないので 1つ次までの範囲としてます。こうすることで処理を約半分までにすることができます。ここで”:”を使った範囲指定が最後の数を含んでしまうので 1 の場合と 2 の場合のみ除いて記述しています。以下が素数判定の 1つの例の code です。
今回 x は 57で調べてみました。他の値を入れて試してみましょう。ループの回数を半分まで減らしましたが実はもっと減らすこともできます(ルートを使うなど)。ぜひ他の手法も試してください。
8.2 ある整数までに含まれる素数の要素を出力する関数
8.1 で書いた odd_num が TURE と FALSE で返すためこれをそのまま条件判定に使うことができます。if 文の中が TURE なら素数の要素をベクトルに追加します。そのために最初に空のベクトルを作りそこに追加していきます。for 文で x まで調べて x までの素数の要素が入ったベクトル odd_nums を結果として出力します。以下が code の例です。
今回 x に 100 を入れることで 100 までの素数を全て出力しています。
総合問題は少し難しかったかもしれませんがこれでRを用いて基本的な使い方がわかったと思います。
9. まとめ
これまでR言語を使ってプログラミングの基本的な操作を学んできました。他にも基本的なことでデータの型や他のデータ構造など知っておくことがありますがこれだけでも簡単な code は書けます。いろんな関数を作ってみたり R 言語の他の機能を使ってみたり遊んでみると面白いです。最初にも説明したようにR言語はデータ処理や統計処理、グラフの描画などに強みがあります。使いこなせばエクセルではできない処理やグラフの描画もできます。筆者も現在いろいろ試しているところです。以上 R 言語の基礎でした。