Rの基本1 コードの実行とオブジェクト

コンソールでのコード実行

Rで単発のコードを実行するには,Consoleタブでコードを入力してEnterで実行する。Consoleには>というプロンプトが表示されるので,そこにコードを入力してEnterを押せば実行できる。基本的には,計算式や関数を入力して実行すれば,その結果が返される。

たとえば,単純な計算をやってみよう。Consoleに4 + 5と入力してEnterを押す。

コンソールでの実行

計算結果[1] 9が返され,再びプロンプト>が表示される。結果の[1]の部分は,Rが返す計算結果の1つ目の要素であることを表している。ここでは,計算結果は1つだけであるが,ベクトルの計算などでは複数の値が返ってくる。結果が一行におさまらない場合には,行の先頭の結果が何番目の要素であるかが表示される。

たとえば,1から100までの数字を返す1:100を実行してみよう。

1:100
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
 [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
 [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
 [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
 [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
 [91]  91  92  93  94  95  96  97  98  99 100

ウィンドウのサイズによるが,この例では1行あたり18個の要素が表示されている。2行目の先頭は19番目の要素なので,[19]と表示されている。同様に3行目の先頭は37番目の要素なので,[37]と表示されている。

今後,Rのコードと実行結果は,このような囲みの中に表記する。

Rにおけるオブジェクト

数値と文字列

Rでは,さまざまな情報を記憶するための「箱」のことをオブジェクトという。Rのオブジェクトには,数値や文字列などが格納されるベクトルや行列,データフレームなど,さまざまな構造がある。

オブジェクトの名前は比較的自由につけることができる。日本語 (漢字)を使うこともできるが,原則として英数字とアンダースコア_だけにしよう。また,Rのオブジェクトの名前は大文字と小文字とを区別する。

たとえば,aという変数に2という数値,bという変数に2.5という数値を記憶させてみよう。

a <- 2
b <- 2.5

このような操作を代入という。代入が正しく行われたかどうかを確認してみよう。

a
[1] 2
b
[1] 2.5
a + b
[1] 4.5
a * b
[1] 5

abの変数にそれぞれ2,2.5という数値が代入されていて,abを用いた計算もできることがわかる。

また,RStudioの”Environment”タブにオブジェクト名abと,代入された値が表示されていることもあわせて確認しよう。

Environment

変数には,数値だけではなく,文字列を代入することもできる。文字列は,ダブルクオーテーション" ",もしくはシングルクオーテーション' 'で囲う。

name <- '大阪 太郎'
gender <- "男"
age <- "20" # ""で囲っているので文字列として扱われる

Environment

nameという変数には”大阪 太郎”という文字列,genderという変数には”男”という文字列,ageという変数には”20”という文字列が代入されていることがわかる。

ここで,ageに代入されている”20”は,20という数値ではなく,文字列として扱われていることに注意しよう。そのため,ageを数値として計算に用いることはできず,下のようなエラーとなる。

age + 10
Error in age + 10: non-numeric argument to binary operator

変数には内容によっていくつかの型 (type)がある。ここでは,abは数値型(numeric),namegenderageは文字列型(character)となる。

EnvironmentタブをList表示からGrid表示に切り替えれば,オブジェクトの型を確認することができる。

Grid表示

文字列型の変数を数値型に変換したい場合には,as.numeric()関数を用いる。

as.numeric(age) + 10
[1] 30

この例ではageは文字列型だが,as.numeric(age)ageを数値型に変換している。数値型に変換されているので,計算を行うことができる。

逆に数値型の変数を文字列型に変換するには,as.character()関数を用いる。

ベクトル

1つのオブジェクトに,複数の数値や文字列を代入することもできる。複数の数値や文字列が格納されたオブジェクトをベクトルという。Rではデータ構造の最小単位はベクトルである。上で用いた「変数」も長さ (要素の数)が1のベクトルであるが,わかりやすく「変数」と呼ぶことにする。

たとえば,nameというベクトルに3人の名前を代入し,ageというベクトルに3人の年齢を代入してみよう。ベクトルは,c(要素1,要素2,...)で表す。

name <- c("大阪 太郎", "兵庫 次郎", "京都 花子")
age <- c(19, 21, 20)

nameageの内容を確認してみよう。

name
[1] "大阪 太郎" "兵庫 次郎" "京都 花子"
age
[1] 19 21 20

nameageの内容が先ほどのものと置き換わっていることがわかる。Rでは既存のオブジェクトに改めて別の内容を代入すると,中身が置き換えられる。

ベクトル

Environmentタブで確認すると,nameageのLengthが1から3へと変わっていることがわかる。Lengthはベクトルの長さを表す。

ベクトルから1つの要素を取り出すには,ベクトル名のあとに[要素番号]をつける。ただし,ベクトルの要素番号は1から始まることに注意しよう(言語によっては0から始まるものもあるので混乱しないよう)。たとえば,nameというベクトルの2番目の要素を取り出すのであれば,次のように書く。

name[2]
[1] "兵庫 次郎"

スクリプトファイル

実際にはコンソールに単発のコードを入力して実行するよりも,スクリプトファイルにコードを書いてそれを実行することの方が多い。新しいスクリプトファイルは,RStudioのメニューから[File] > [New File] > [R Script]を選択すれば作成できる。

スクリプトファイルでは,[Ctrl] + [Enter]を押すと,カーソルのある行のコードが実行され,カーソルが次の行に移動する。これによって1行ずつ実行結果を確認しながら実行していくことができる。

範囲を指定して[Ctrl] + [Enter]を押すと,選択された範囲のコードが順に実行される。また,[Ctrl] + [Shift] + [Enter]を押すと,コードが最初からすべて実行される。

Consoleで単発のコードを実行した場合にも,Histroyタブからスクリプト・ファイルへ実行したコマンドを貼り付けていくと良い。そうすれば,いつでも作業を最初から再現できる。研究では,結果を再現できることが極めて重要。

スクリプトファイルを書く際には,以下のようなルールに則って書くようにしよう (あくまでコードの視認性のためのルールであり,コードが動かないわけではない)。詳細なルールは,Tidyverse Style Guideを参照。

ただし,最初からすべて覚えようとすると大変なので,他の人が書いたコードを見たり,自分で視認性を意識しながらコードを書いたりして,少しずつ慣れていけば良い。

また,RStudioをはじめとするコードエディタには,上記のようなルールを適用して,コードを自動でフォーマットする機能がある。

コメント

スクリプトファイルのなかで#を書くと,その位置から行の終わりまでがコメントとして扱われる。したがって,行の先頭に#を書けば,その行はすべてコメントとして扱われる。コメントはコードを実行する際には無視されるので,コードの説明やメモなどを自由に書き込んでおくと良い。

カンマ,演算子の前後にはスペースを入れる

スクリプトファイルを書くときには,,+, -などの演算子の前後にはスペースを入れるのがルール (コードを見やすくするためのルールであり,スペースを入れなくてもコードは動く)。たとえば,a<-1+2と書くのではなく,a <- 1 + 2と書く。

改行とインデント

コードは1行が長くなると視認性が悪くなる。Rのコードは,(,+, -などの演算子のあとに改行を入れることができる。

たとえば,上のようなコードは,1行が長い。そこで,(と),のあとに改行を入れると,コードが見やすくなる。

また,Rのコードは自由にインデント (字下げ) することができる。インデントには,通常半角スペース2つ分を用いる。

インデントには一般的なルールがあるが,インデントによってコードがエラーになることはないので,はじめのうちはそこまで気にする必要はない。基本的には,長い行を改行によって分割するときには2行目以降をインデントする。