R と RStudioの入門

概要

講義: 45 分
演習: 10 分
質問
  • RStudio はどのように操作したらよいですか?

  • R とはどのようにやりとりしたらよいですか?

  • 環境の管理はどうしたらよいですか?

  • パッケージのインストールはどうしたらよいですか?

目標
  • RStudio IDE の各ウィンドウの使用目的と使い方が説明出来るようになりましょう

  • RStudio IDE のボタンやオプションの位置を理解しましょう

  • 変数が定義出来るようになりましょう

  • 変数に値の設定が出来るようになりましょう

  • R セッションのワークスペース管理が出来るようになりましょう

  • 算術演算子や比較演算子が使えるようになりましょう。

  • 関数が呼び出せるようになりましょう。

  • パッケージの管理が出来るようになりましょう。

動機

科学は複数の段階からなる作業です:実験を計画し、データを収集したら、 そこから本当の楽しみが始まります!このレッスンでは、その過程をRとRStudioを使って どう進めるのかをお伝えします。まず生のデータから、予備解析をし、結果をどう グラフ上にプロットするかを学びます。ここでの例はgapminder.org のデータセットを使います。このデータセットには、多くの国の人口の時系列データが入っています。 データをRに読み込むことができますか?セネガルの人口をプロットできますか? アジア大陸にある国の平均所得を計算できますか? これらのレッスンの終わるまでに、これらの全ての国の人口をプロットしたりするようなことが 一分足らずでできるようになるでしょう!

ワークショップを始める前に

RとRStudioの最新バージョンが、自分のコンピューターにインストールされているか確認してください。最新バージョンであることが重要である理由は、ワークショップで使うパッケージには、Rが最新でないと、正常に(または全く)インストールされないものがあるからです。

ここからRの最新バージョンをダウンロード及びインストール下さい ここからRStudioをダウンロード及びインストール下さい

RStudio入門

Software CarpentryのR部分のワークショップへようこそ。

このレッスンでは、R言語の基礎と、知っていると後々かなり楽になる科学的プロジェクトのために コードを整える最適な方法をお教えしようと思います。

このレッスンではRStudioを使います。RStudioは、無料であり、Rを組み込んだオープンソースの 総合開発環境(IDE: Integrated Development Environment)です。RStudioは、全てのプラットフォーム(サーバーも含む)で起動できること、 エディタが組み込まれていることや、プロジェクト管理やバージョン管理にも対応しているなど、 良いところがいっぱいがあります。

基本的なレイアウト

最初にRStudioを開くと、3つのパネルが現れます:

RStudioレイアウト

Rスクリプトなどのファイルを開くと、左上にエディタパネルも開きます。

拡張子.Rのファイルを開いたときのRStudioレイアウト

RStudioでの作業の流れ

RStudioで作業する2つの主な方法:

  1. インタラクティブなRコンソールで試したり、確認したりした後、コードを 後で走らせる.Rファイルにコピーする。
    • まず始めてみるときや、小規模なテストをするのに適している。
    • すぐ面倒になる。
  2. まず.Rファイルに書き、インタラクティブなRコンソールへ、現在の行、選択した行、 修正した行など送るコマンドを走らせるために、RStudioのショートカットキーを使う。
    • 始めるのによい方法。全てのコードが後々のために保存される。
    • 作ったファイルを、RStudioから又は”source()”関数を使って走らせることができる。

ヒント:ひとかたまりのコードを走らせる

RStudioには、エディタからコードを走らせる色々な方法があります。 ボタン、メニュー選択、そしてキーボードのショートカットがあります。 現在の行を走らせるには、

  1. エディタパネルのRunのボタンをクリックする
  2. 「Code」メニューから「Run Lines」を選択する
  3. WindowsかLinuxなら、Ctrl+Returnを押す または、OS Xなら、+Return。 (このショートカットはボタンの上にマウスを合わせると表示される) コードのかたまりを走らせるには、まずその部分を選択してから Runを押します。 もし、コードのかたまりを走らせた後で、その一部を修正した場合、 その部分を選択してRunする必要はありません。その場合は次の Re-run the previous regionボタンが使えます。これは、前のコードのかたまりを 修正を行った部分を含めて走らせます。

R入門

Rを使う時間のほとんどは、Rのインタラクティブコンソールでの作業となるでしょう。 ここが、全てのコードを走らせる、また、.Rファイルにコードを加える前にアイディアを 試してみるのに使える環境となります。 このRStudioのコンソールが、コマンドライン環境にR と入力するのと同じ環境になります。

Rインタラクティブセッションでまず目に入ってくるのは、ひとかたまりの情報と その後に続く、「>」と点滅するカーソルです。これは多くの観点で、 シェルのレッスンで学んだシェル環境と似ています。 つまり、「読み、実行し、出力するループ」の考えと同じように動くので、 コマンドを入力すれば、Rは、それを実行しようとし、そして結果を返すのです。

Rを計算機としての使用

一番単純なRの使い方は、演算です:

1 + 100
[1] 101

するとRは、「[1]」の後に回答を表示します。「[1]」については後で説明するので、 今は気にしなくても大丈夫です。今のところ、出力されたものを示すものだと思ってください。

バッシュのように、Rは、不完全なコマンドが入力されると、それが完成されるまで待ちます:

> 1 +
+

Rセッションで改行キーを押す度に、「>」の代わりに「+」が出力される場合、 コマンドが完成されるのを待っていることを示しています。そのコマンドを取り消したい 場合は、単純に「Esc」を押せば、RStudioは「>」を返します。

ヒント:コマンドの取り消し

RStudioではなく、コマンドラインからRを使う場合、 コマンドを取り消す場合、Escの代わりにCtrl+C を使う必要があります。これは、Macユーザーも同じです!

コマンドの取り消しは、不完全なコマンドを消す他にも使えます。 走っているコードを止めてとRに伝えるにも使え(例えば、予想よりも かなり長くかかっている場合)、その他にも、今書いているコードを 消去するにも使えます。

Rを計算機として使う場合、演算の順番は、学校で学んだだろうものと 同じです。

一番先に行われる処理から一番後に行われる処理:

3 + 5 * 2
[1] 13

デフォルトと違う順番で計算させたい場合や、意図を明確にしたい場合は、 演算をまとめるために、括弧を使いましょう。

(3 + 5) * 2
[1] 16

括弧をつける必要ではないときは、面倒かもしれませんが、そうすることで自分の意図 するところがはっきり伝わります。 自分が書いたコードを、後々他の人が読むことになるかもしれないことを忘れないように。

(3 + (5 * (2 ^ 2))) # 読みづらい
3 + 5 * 2 ^ 2       # ルールを覚えている人には明確
3 + 5 * (2 ^ 2)     # ルールを忘れている人にも伝わるはず

コードの後の文は、「コメント」と呼ばれます。 シャープ(ナンバー)記号# の後に来るものは、Rがコードを実行する際は無視されます。

とても大きい、又は小さい数には、指数表記が使われます:

2/10000
[1] 2e-04

これは、「10^XXで掛けたもの」を略したものです。つまり2e-4は、 2 * 10^(-4)の略です。

数を指数記号で書くこともできます:

5e3  # マイナスがないことに注意
[1] 5000

数学関数

Rには、多くの数学関数が備え付けられています。関数を呼び出すには、 関数名と始め括弧と終わり括弧を書きます。 括弧の中に書いたものが、関数の引数となります:

sin(1)  # 三角関数
[1] 0.841471
log(1)  # 自然対数
[1] 0
log10(10) # 10を底とする対数
[1] 1
exp(0.5) # e^(1/2)
[1] 1.648721

Rにある全ての関数を覚えようとして心配する必要はありません。 Googleで検索すればいいですし、関数の始まりさえ覚えていれば RStudioのタブ入力補完機能が使えます。

これがRStudioが、Rそのものを使うよりもいい理由のひとつです。 RStudioには、自動補完機能があり、関数、その引数、その取りうる値を より簡単に見つけることができます。

コマンド名の前に、? を付けることで、そのコマンドのヘルプのページを開くことができます。 そのコマンドの詳細についての説明やそれがどう動くかだけではなく、ヘルプページの最後まで スクロールすると、通常、コマンドの使い方を伝えるコードを用いた事例集が参照できます。 これについては、後ほど、例で見てみることにしましょう。

何かを比較する

Rを使って比較をすることもできます:

1 == 1  # 等価(イコールが2つあることに注意。「は、~と等しい」と読む)
[1] TRUE
1 != 2  # 不等価(「は、~と等しくない」と読む)
[1] TRUE
1 < 2  # より少ない
[1] TRUE
1 <= 1  # より少ない、又は等しい
[1] TRUE
1 > 0  # より大きい
[1] TRUE
1 >= -9 # より大きい、又は等しい
[1] TRUE

##ヒント: 数の比較

数を比較するときの注意: 整数型(整数のみを表すデータ型) 以外では、2数の比較に決して == を使わないこと。

コンピュータは、小数点以下の数を限られた精度でしか示せません。 かもしれません。すると、二つの数がRで同じように表示されても 実際は、その背後で異なる形で表されており、したがって ごくわずかな誤差(機械の数値許容範囲)があるかもしれません。

代わりに、all.equal 関数を使うといいでしょう。

詳しくは: http://floating-point-gui.de/

変数及び代入

代入演算子<-を用いて、次のように値を変数に入れることができます:

x <- 1/40

お気づきのように、代入では値は表示されません。代わりに、後々のために 変数と呼ばれるものに、値を入れます。x は、今、 0.025を持っています:

x
[1] 0.025

より正確には、記録された値は、浮動小数点数 と呼ばれる小数近似 (decimal approximation)です。

RStudioのパネルの中のひとつ、Environment (環境)タブで、xとその値が表示されている ところを見て下さい。変数xは、数を出す演算で数の代わりに使うことができます:

log(x)
[1] -3.688879

変数は、再度、代入することもできます:

x <- 100

xは、0.025という値でしたが、今は、100になりました。

代入する値は、既に代入されている変数でもいいです:

x <- x + 1 #RStudioが、右上のタブにあるxの詳細をどう更新したかにも御留意下さい
y <- x * 2

代入の右側については、Rで使える表現であれば何でも大丈夫です。 右側については、代入される前に、計算が完全に実施されます。

変数名には、文字、数字、下線、ピリオドを含むことができます。 数から始まることはできず、空白を含むことはできません。 長い変数名のつけ方は様々です。例えば、

何を使うかは書き手次第ですが、一貫性を持たせるようにしましょう。

代入の演算子として、=を使うこともできます:

x = 1/40

しかし、これはRユーザーでは、あまり使われていません。重要なのは、 使用する演算子に一貫性を持たせることです。場合によっては、 =を使うよりも<-を用いる方が誤解が少ないこともあります。 Rコミュニティーの中で、最もよく使われている方法でもあるので、 <-を使うのがおすすめです。

チャレンジ1

次のうちどれがRの変数名として使えますか?

min_height
max.height
_age
.mass
MaxLength
min-length
2widths
celsius2kelvin

チャレンジ1の解答

Rの変数として使えるものは次のとおりです:

min_height
max.height
MaxLength
celsius2kelvin

次のものは、隠れ変数を作ります:

.mass

次のものは、変数を作るために使えません:

_age
min-length
2widths

ベクトル化

留意すべきことの最後のひとつは、 Rはベクトル化しているということで、つまり、 変数と関数が値をベクトルとすることができます。 物理や数学とは対照的に、 Rのベクトルは、同じデータ型のある順番を持つ値の集合として定義されています。例えば:

1:5
[1] 1 2 3 4 5
2^(1:5)
[1]  2  4  8 16 32
x <- 1:5
2^x
[1]  2  4  8 16 32

これは、とても使えるのですが、詳しくは後続のレッスンで述べることにします。

環境を管理する

Rセッションで使えるコマンドがいくつかあります。

lsは、グローバル環境(作業中のRセッション)にある全ての変数と関数をリスト化します:

ls()
[1] "x" "y"

ヒント:隠れたオブジェクト

シェルのように、lsはデフォルトでは、”.”で始まる変数と関数を表示しません。 全てのオブジェクトをリスト化するには、代わりにls(all.names=TRUE)と書きます

ここでは、lsに特に引数を与えませんでしたが、それでもRに関数を 呼び出していることを伝えるために括弧は必要です。

もしlsだけを入力すると、Rは、その関数のソースコードを表示してしまいます!

ls
function (name, pos = -1L, envir = as.environment(pos), all.names = FALSE, 
    pattern, sorted = TRUE) 
{
    if (!missing(name)) {
        pos <- tryCatch(name, error = function(e) e)
        if (inherits(pos, "error")) {
            name <- substitute(name)
            if (!is.character(name)) 
                name <- deparse(name)
            warning(gettextf("%s converted to character string", 
                sQuote(name)), domain = NA)
            pos <- name
        }
    }
    all.names <- .Internal(ls(envir, all.names, sorted))
    if (!missing(pattern)) {
        if ((ll <- length(grep("[", pattern, fixed = TRUE))) && 
            ll != length(grep("]", pattern, fixed = TRUE))) {
            if (pattern == "[") {
                pattern <- "\\["
                warning("replaced regular expression pattern '[' by  '\\\\['")
            }
            else if (length(grep("[^\\\\]\\[<-", pattern))) {
                pattern <- sub("\\[<-", "\\\\\\[<-", pattern)
                warning("replaced '[<-' by '\\\\[<-' in regular expression pattern")
            }
        }
        grep(pattern, all.names, value = TRUE)
    }
    else all.names
}
<bytecode: 0x7f915e54aec8>
<environment: namespace:base>

もう必要ないオブジェクトを消去するには、rmが使えます:

rm(x)

もし、環境に、色々なものがいっぱいあって、それらを全て消去したい場合、 lsの結果をrm関数に渡すことで対応できます。:

rm(list = ls())

ここでは、二つを組み合わせました。演算の順番のように、一番内側の括弧の中のものが、 まず最初に実行され、実行が続きます。

ここでは、lsの結果をrmの引数のリストとして用いるべしと設定しました。 名前で引数の値を定めるときは、演算子=必ず使わなければなりません!

もし代わりに<-を使うと、意図しない副作用が現れるか、エラーメッセージが現れます:

rm(list <- ls())
Error in rm(list <- ls()): ... must contain names or character strings

ヒント:警告かエラーか

Rが予期しないことをした場合、注意が必要です!上記のようなエラーは、 Rが演算できない場合に出力されます。一方、警告は、通常、 関数は走ったけれど、予期した形で実行されなかったかもしれない ことを示します。

両方の場合、Rが表示するメッセージは、問題をどう修正すればよいのか という糸口を通常与えてくれます。

Rパッケージ

パッケージを書くか、誰かが書いたパッケージを使って、Rに関数を加えることができます。 今現在CRAN (the comprehensive R archive network)上にある 10,000 を越えるパッケージが使用可能です。RとRStudioには、パッケージを管理する機能があります:

チャレンジ2

次のプログラムのそれぞれの宣言の後、それぞれの変数の値は 何になるでしょうか?

mass <- 47.5
age <- 122
mass <- mass * 2.3
age <- age - 20

チャレンジ2の解答

mass <- 47.5

これは、変数massに、47.5の値を与えます

age <- 122

これは、変数ageに122の値を与えます

mass <- mass * 2.3

これは、既存の値47.5に2.3を掛けた新しい値 109.25を変数massに与えます。

age <- age - 20

これは、既存の値の122から20を引いた新しい値 102を変数ageに与えます。

チャレンジ3

チャレンジ2のコードを走らせ、massとageを比較するコマンドを書いて下さい。 massはageよりも大きいでしょうか?

チャレンジ3の解答

Rを使ってこの質問に回答する方法のひとつは、 次のように>を用いることです:

mass > age
[1] TRUE

109.25は102よりも大きいため、これは、論理型の値、TRUEとなる。

チャレンジ4

massとageの変数を消去し、作業環境をきれいにしよう。

チャレンジ4の解答

これを行うには、rmコマンドを使います。

rm(age, mass)

チャレンジ5

次のパッケージをインストールしよう: ggplot2, plyr, gapminder

チャレンジ5の解答

求められているパッケージをインストールするには、コマンドinstall.packages()が使えます。

install.packages("ggplot2")
install.packages("plyr")
install.packages("gapminder")

まとめ

  • RStudio で R プロラムの作成と実行を行う。

  • R は算術演算子や数学関数が使える。

  • <- を使って変数に値を設定する。

  • ls() を使ってプログラム内の変数をリストする。

  • rm() を使ってプログラム内のオブジェクトを消去する。

  • install.packages() を使ってパッケージ(ライブラリ)のインストールを行う。