Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

Rの初歩 - R Notebook

昨年の今頃は、受講していた確率・統計講座に関連して、よくRを触っていた。来月から新しく関連講座を受講することもあり、Rの勘を取り戻すべく復習を再開した。こういうとき、過去のブログ投稿が役に立つ。読みながら昨年のコードを眺めているだけで、勘所が想起してくる。

講義の課題提出、特にRを利用したレポート提出にはR Notebookが便利だ。昨年投稿した一連の投稿にはR Notebookの話題が含まれていなかった。それを補うべく、今回はRStudioでのR Notebookを紹介する。

R Notebookとは

R NotebookとはRコードとその出力結果が埋め込まれた文書ファイルだ。単一のhtmlファイルとして出力され、画像として出力されるグラフもBase64エンコードでhtml中に埋め込まれるため一ファイルで完結してしまう。
PythonでJupyter Notebookを利用した経験があれば、そのR版であると言えば容易に想像できるだろう。Markdownを用いた文書整形、文中でのコード埋め込み、グラフ出力など、ほぼ同一の機能がサポートされている。

RStudioから利用するには、単純にR Notebookファイルを新規作成すればよい。その機能を初めて利用する場合にはパッケージ導入を指示されるが、「Yes」ボタンを押下すればRStudioが自動的に導入してくれる。
f:id:espio999:20190202150839p:plain

コードの作成、実行、プレビュー

新規作成したファイルには、自動的に生成された文書とコードが出力されている。これらは消去して構わないが、ここではそのまま実行してみる。文中に埋め込まれたコードの下にグラフが表示される。全てのコードを実行することもできるし、コードを部分的に実行してみることもできる。
f:id:espio999:20190202151105p:plain

この文書を「report」と命名して保存すると、「report.nb.html」が出力される。出力されたhtmlをブラウザで開いてみると、文書、コード、グラフが表示されているのが確認できる。表示されているコードを非表示にしたければ、「Code」ボタンから操作する。
f:id:espio999:20190202151300p:plain

ブラウザの機能を通じてソースコードを参照できるのであれば、グラフ画像に関連する箇所を確認してみるとよい。画像ファイルがhtmlソースの一部に埋め込まれていることが確認できる。
f:id:espio999:20190202151341p:plain

グラフが表示されるだけでなく、関数から出力されるサマリー表示や、データセットの一覧表示なども、自動的に整形表示されることを次項で紹介する。

コード埋め込みの注意点

2種類の埋め込み

文中にまとまったコードを記述する場合、該当するコードを次のように括る。「`」はアポストロフィだ。シングルコーテーションではない。
プレビュー、あるいは実行してみると、サマリー表示が整形されるばかりでなく、データセットが一定量毎に分割されて表示されているのが分かる。

```{r}
summary(cars)
print(cars)
```

f:id:espio999:20190202151529p:plain

また文中にコードの出力結果を埋め込む場合には、次のように記述する。プレビューすると計算部分が数値に置き換えられているのが確認できる。

cars.speedの最小値は`r min(cars$speed)`

f:id:espio999:20190202151557p:plain

このような筆記ルールはチートシートを参照すると良い。次のリンクからR Markdown Cheat Sheetをダウンロードできる。
www.rstudio.com

文書表示までの実行順序

文書表示までの実行順序には注意が必要だ。特に同一の変数を使いまわして文中へ出力結果を埋め込んでいる場合、特に警戒する必要がある。R Notebookは全てのコードを処理した上で、その結果が文書に反映される。文書の上から順番にコードが実行され、その結果を逐一文書に反映していくのではない。
実験として、次のコードを付け足してみる。その出力結果には、全て「3」が反映されていることが分かる。もし各行に1、2、3と反映することを期待していたならば、変数を分ける必要がある。

```{r}
a = 1
```
aの初期値は`r a`。
```{r}
a = 2
```
aに代入されたのは`r a`。
```{r}
a = 3
```
aは`r a`に置き換えられた。

f:id:espio999:20190202151718p:plain