R の基本1

コンソール

R を起動すると初期メッセージが表示された後、プロンプト > が表示されてコマンド(式や関数)が入力できるようになる。 入力したコマンドは [Enter] キーを押すことで実行される。


コマンド

例えば 1 + 2を実行する。

> 1 + 2
[1] 3

結果出力の頭に [1] と表示されるが、これは結果の全出力のうちで「3」が 1 番目であることを意味している。

例えば 10:50 を実行すると 10 から 50 までの連番がベクトルとして出力される。

> 10:50
 [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
[30] 39 40 41 42 43 44 45 46 47 48 49 50

結果出力の 2 行目の頭にある [30] は「39」が 30 番目であることを意味している。

複数のコマンドを一行に書いて実行したければ ;(セミコロン)で区切ってコマンドを並べると前から順番に処理される。

> 1 + 2; 4 * 5; 10 / 3
[1] 3
[1] 20
[1] 3.333333

コメント

# の後の文章はコメントとして扱われるので実行されない。


終了

コンソールは quit() もしくは q() と入力することで終了する。

> quit()
> Save workspace image? [y/n/c]:

ワークスペースを保存するかと聞いてくるので、今までの処理結果を保存しておきたければ [y]、保存したくなければ [n] を入力する。

保存したワークスペースは次回コンソールを起動したときに自動的に読み込まれる。 ワークスペースはデフォルトだと .RData というファイルに保存されるので、ワークスペースをクリアしたければこのファイルを削除する。

特殊な値

R ではいくつかの特殊な値がある。

定数名 意味
TRUE(もしくは T
FALSE(もしくは F
NA 欠損値
NaN 計算不能な計算結果
Inf 無限大の計算結果
NULL もともと値が存在しない

演算

演算を行うための記号を演算子という。

算術演算子は以下の通りである。

算術演算子 機能
+ 足し算
- 引き算
* かけ算
/ わり算
^ べき乗
%% わり算の余り
%/% わり算の商

比較演算子は条件分岐などで使う。 これらは結果を TRUEFALSE で返す。

比較演算子 機能
== 左辺と右辺が等しければTRUE
!= 左辺と右辺が等しくなければTRUE
< 左辺が右辺より小さければTRUE
<= 左辺が右辺以下ならばTRUE
> 左辺が右辺より大きければTRUE
>= 左辺が右辺以上ならばTRUE
> 5 > 10
[1] FALSE
> 5 < 10
[1] TRUE

複数の条件式をつなげる論理演算子は以下の通り。

論理演算子 機能
! 否定
& ベクトルの論理積(AND)
| ベクトルの論理和(OR)
&& 条件式の論理積(AND)
|| 条件式の論理和(OR)

パッケージ magrittr を読み込むと、パイプ演算子 %>% が使えるようになる。 パッケージ imager を読み込むと magrittr は自動的に読み込まれる。

パイプ演算子は処理の結果を次の関数の第一引数に渡すという働きをする。

変数

変数は数字や文字列などの値の入れ物である。 変数に値を入れることを代入という。 変数名にはある程度自由に名前をつけることができる。

R において、変数への代入は <- を使って行う(他のプログラミング言語のように = でも可)。

> 変数 <-

もしくは -> を使って値と変数を逆にしてもよいが、紛らわしいのであまり使わない。

>-> 変数

演算結果も直接変数に代入することができる。

> result <- 2 ^ 10

変数のみだとその値を表示する。

> result
[1] 1024

丸かっこでくくると変数に代入しつつその値も表示する。

> (result <- 2 ^ 10)
[1] 1024

R において、値は型によって取り扱いの種類が分けられる。 変数には何でも代入できるが、変数に値を代入した時点で変数の型が自動的に決められる。

変数や値の型は class() で分かる。

> class(5)
[1] "numeric"
> class(3.14)
[1] "numeric"
> class(5L)
[1] "integer"
> class("abcd")
[1] "character"
> class(TRUE)
[1] "logical"

基本の型は以下の通り。

種類
実数 numeric
整数 integer
複素数 complex
文字 character
論理値(TRUE, FALSE, NA logical

関数

関数は「関数名(引数)」という形をしている。 関数は引数に値を与えると、何か結果を返してくれるものである。

例えば、1, 3, 5 という値の合計を計算する関数は sum() である。

> sum(1, 3, 5)
[1] 9

この場合、関数名は sum で、引数はかっこの中の 1, 3, 5 である。 引数を複数与える場合は ,(カンマ)で区切る。

R であらかじめ用意されている関数(組み込み関数)の他に、パッケージ(ライブラリ)を読み込んで使える関数と自分で定義する関数がある。


組み込み関数

組み込み関数の一覧は builtins() で見ることができる。

それぞれの関数について知りたいときは help(関数名) を使うと良い。


関数の定義

自分で関数を定義するには function(引数) {処理} を使う。

引数には、必須な引数と、省略可能なオプションの引数が定義できる。 関数の定義で引数に k = 5 のように値を与えれば k は省略可能なオプションになり、k を省略するとデフォルトで 5k に代入されて関数内の処理が行われる。

関数の戻り値は関数内の最後に実行されたコマンドの結果が戻り値となる。 戻り値を明示したければ return()invisible() を使う。 どちらも同じような働きをするが、return() は値を戻すと同時に画面に出力し、invisible() は画面に出力しない。

例えば、2次方程式 $ax^{2}+bx+c=0$ の解を求める関数 solvequad(a, b, c) を定義する。

解の公式 \[ x_{\pm}=\frac{-b\pm\sqrt{D}}{2a},\quad D=b^{2}-4ac \]

solvequad <- function(a, b, c, complex = FALSE) {
  d <- b^2 - 4 * a * c
  if (d >= 0) {
    sqrtd <- sqrt(d)
  } else if (complex) {
    sqrtd <- 1i * sqrt(-d)
  } else {
    sqrtd <- NaN
  }
  xp <- (-b + sqrtd) / (2 * a)
  xm <- (-b - sqrtd) / (2 * a)
  return(c(xp, xm))
}

この関数では $x_{+}, x_{-}$ の二つの解を計算してベクトルで戻す。 最後の complex = FALSE はオプションの引数を定義しており、引数を省略すれば自動的に complexFALSE が代入される。 complexTRUE なら $D<0$ でも $\sqrt{D}$ を虚数で計算を行うという引数である。

> solvequad(1, -2, -3)
[1]  3 -1
> solvequad(0.5, 1, 1)
[1] NaN NaN
> solvequad(0.5, 1, 1, complex = TRUE)
[1] -1+1i -1-1i

虚数は数字の最後に i がつく。

データの集合

統計では表のようにいくつもの数値や文字列が集まったデータを扱う。 R ではこのようなデータをひとまとめにして扱うために、データの集合という概念がある。

データの集合には主に以下の種類がある。

種類 意味
ベクトル 同じ型のデータの列
行列 matrix 同じ型のデータの行列(2次元)
配列 array 行列を拡張したもの(多次元が可能)
リスト list 異なる型のデータの列
データフレーム data.frame 任意の型のベクトルの集合

行列や配列などの要素のインデックスは 1 から始まるので注意(一般的なプログラミング言語では 0 から始まる)。


ベクトル

ベクトルは同じ型のデータの列である。

ベクトルは c() で要素を結合して作ることができる。 ベクトルの要素数は length() で分かる。

数値 1, 3, 5 のベクトル

> c(1, 3, 5)
[1] 1 3 5
> length(c(1, 3, 5))
[1] 3

文字列 “red”, “blue”, “green” のベクトル

> c("red","blue","green")
[1] "red"   "blue"  "green"

3 から 11 までの連番のベクトル

> 3:11
[1]  3  4  5  6  7  8  9 10 11

1 から 9 まで 2 ずつ増加するベクトル

> seq(1, 9, 2)
[1] 1 3 5 7 9

3 が 5 つのベクトル

> rep(3, 5)
[1] 3 3 3 3 3

1 から 3 までの連番を 5 回くり返すベクトル

> rep(1:3, 5)
 [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3

条件分岐

if (条件式) {処理}
if (条件式) {処理1} else {処理2}
if (条件式1) {処理1} else if (条件式2) {処理2} else {処理3}

ループ

for (ループ変数 in ベクトルかリスト) {ループ処理}
while (条件式) {ループ処理}

ループ処理の中で処理の流れを変えるコマンドとして breaknext がある。

例えば、$10!=1\times2\times\cdots\times 10$ を計算するには以下のようにする。

> r <- 1; for (x in 1:10) {r <- r * x}; print(r)
[1] 3628800

ちなみに $10!$ はもっと簡単に factorial(10)gamma(10+1) で計算できる。gamma() はガンマ関数と呼ばれるものである。