1 オブジェクト

Rではオブジェクト(あるいは変数)と呼ばれる「箱」に計算結果の数値や読み込んだデータ(後で説明する)を格納することができる.オブジェクトに格納しておくと,後からそれらの値やデータを再度利用したくなったときに,いちいち再度計算式を入力したり,データの読み込みをすることなく,オブジェクトを呼び出すだけで,それらの値やデータを呼び出すことができる.

以下の例では5-3の結果をResという名前のオブジェクトに格納し,さらにResというオブジェクト名を使ってその中身(計算結果)を呼び出している.

Res <- 5-3
Res
## [1] 2

1.1 print()関数

オブジェクトの内容は,上記のようにオブジェクト名を記載するだけでも出力されるが,print()関数使って出力させることもできる.なお,print()関数はオブジェクトだけでなく数字や文字列も表示させることが出来る.

## print()関数を使って表記させることも可能
print(Res)
## [1] 2
print(1)
## [1] 1
print("Hello World.")
## [1] "Hello World."

なお,print()関数には,小数点の桁数を指定するdigitsという引数がある.この引数には表示させたい小数点以下の桁数を指定する.以下はpiの値を小数点以下3桁まで表示させる例である.なお,piは円周率を表す定数であり,Rでは予めその数値が組み込まれている.

print(pi, digits=3)
## [1] 3.14

2,3,5のそれぞれ正の平方根について,それぞれをオブジェクトとして保管し,それらのオブジェクトを1つ1つprint()関数とdigits引数を用いて小数第5桁まで表示させなさい.

1.2 オブジェクトを使った演算

オブジェクトに格納された値は,そのままオブジェクト名で計算させることもできる.先ほどResには2が格納(代入ともいう)されているので,以下の計算は10となる.

8+Res
## [1] 10

1.3 オブジェクトの名前設定

オブジェクト名はどのような名前でも構わない.日本語も用いることができる.大文字と小文字は区別される.ただし,半角スペースや演算子に用いられている記号,アットマーク記号@などは利用することができない.また,数字から始まる名前を付けることも不可である(名前の途中に数字が入っている分には問題ない).

ピリオド.やアンダーバー_は利用できる.一般的には,複数の単語を連結させて用いる場合には_で区切る..は階層性を持ったデータを区別する使われる.以下はそれらの例.

my_res <- 9-4
my_res.power <- my_res ^3

なお,間違えた名前で呼び出すと,もしその名前のオブジェクトが他にないのであれば以下のようなエラーが帰ってくる.

RES
## Error: object 'RES' not found

「オブジェクトが見つかりません」ということで,このエラーが帰ってきたら,オブジェクト名が間違えているかを確認してほしい.

ただし,オブジェクト名を間違えていた時に,間違えた名前と同一の名前のオブジェクトが別に存在していた場合には,このようなエラーは帰って来ずに,そのまま間違えたオブジェクトを使って続く処理が実行されていくので,その場合には自分で間違いに気づきにくくなる.RStduioではすでに使われているオブジェクト名であれば,最初の数文字を入力するとリスト表示してくれる入力支援機能があるので,オブジェクトが増えてきたときにはそれを是非利用して入力するとよい.

1.4 オブジェクトの上書き

一度設定したオブジェクトに新たな値を代入することもできる.以下の例では,my_resオブジェクトに5を代入している.

my_res <- 5
my_res
## [1] 5

この際、最初に代入したものが数値であっても、後から文字列を代入することもできる。以下の例では、5が入っているmy_resオブジェクトに"Hello World."という文字列を代入している。

my_res <- "Hello World."
my_res
## [1] "Hello World."

1.5 オブジェクトの削除

作ったオブジェクトはconsoleでls()関数を実行するか(console内にその時点で存在するオブジェクトがすべて表示される),RStudio上の右上ペインの「Environment」タブで確認することができる.

ls()
## [1] "my_res"       "my_res.power" "Res"
オブジェクトリスト
オブジェクトリスト

オブジェクトはいくつでも作ることができるが,あまりに多くなってくるとそれだけPCのメモリを喰ってしまうことになる. そういった場合には作ったオブジェクトの中で使わなくなったオブジェクトを削除すると良い.

オブジェクトを削除する方法は大きく2つある. 1つは,すべてのオブジェクトをまとめて削除する方法で,これは,単にEnvironmentタブの中にあるほうきのアイコンをクリックすればよい.

オブジェクトの全削除
オブジェクトの全削除

一方,特定のオブジェクトを削除したい場合には,Consoleでrm()関数を実行する.関数の引数には削除したいオブジェクトの名前を入力すればよい.

a<- "test1"
b<- "test2"
c<- "test3"
ls() # 今あるオブジェクトを確認するコマンド.別に右上の「Environment」で確認できるが・・・
## [1] "a"            "b"            "c"            "my_res"       "my_res.power"
## [6] "Res"
rm(a) # aオブジェクトを除く
ls()
## [1] "b"            "c"            "my_res"       "my_res.power" "Res"

aオブジェクトが除かれているのが確認できるだろう.

複数のオブジェクトを削除したい場合には,それらを書き込めばよい.

rm(b,c)
ls()
## [1] "my_res"       "my_res.power" "Res"

bcが除かれたのが確認できる.

なお,rm()スクリプト(後程説明)に書き入れても構わないが,スクリプトに書き入れると,そのスクリプトを実行する度にオブジェクトの削除が行われることになるので,必要に応じてConsoleで実行するのが良いだろう.

オブジェクト名に使ってはいけない語

Rでは,予約語と呼ばれる特定の単語はオブジェクト名として使うことができない.予約語は以下の通りである.

予約語 説明
if 条件式(if文)
else if文に続く条件が満たされない場合の処理
repeat 無限ループ
while 条件が満たされる間ループ
function 関数定義
for 繰り返し処理(forループ)
in for文の範囲指定やベクトル内の要素
next ループの次の反復にスキップ
break ループの終了
TRUE 論理値(真)
FALSE 論理値(偽)
Inf 無限大(Infinity)
NaN 数値として定義できない値
NA 欠損値
... 不特定多数の引数
return 関数の戻り値
switch 条件に基づく処理の分岐
break ループから抜ける
NA 欠損値
Inf 無限大(∞)
NaN 非数(Not a Number)
NULL 空のオブジェクト

これらの予約語を単独でオブジェクト名にして値を代入しようとしてもエラーが帰ってくる.

if <- 5
## Error in parse(text = input): <text>:1:4: unexpected assignment
## 1: if <-
##        ^

さらに,以下のものは定数として予め数値が定義されている.

定数名 説明
pi 円周率
letters アルファベット小文字のベクトル
LETTERS アルファベット大文字のベクトル
month.name 月名のベクトル
month.abb 月名の略称のベクトル
T 論理値(TRUE)
F 論理値(FALSE)
.Machine コンピュータの数値計算に関する定数(精度や最大値などの情報)

予約語とはことなり,これらの定数については別な値を代入することは可能であるが,その後の計算に影響を及ぼす可能性があるので,基本的には変更しない方がよい.なお,もし定数に値を代入してしまった場合には,rm()関数をその定数名を引数として与えて実行すれば,元の定数に戻る.

print(pi)
## [1] 3.141593
pi<-3
print(pi)
## [1] 3
rm(pi)
print(pi)
## [1] 3.141593

前回の課題について,各式の計算結果をオブジェクトに出力させるとともに,print()関数を用いてその内容を出力させないさい.なお,それぞれのオブジェクト名は好きな名前をつけて構わない.

2 文字列

これまで数値ばかりを扱ってきたが,Rでは数値だけでなく文字列を扱うこともできる.

nchar("Hidenori Fujino")
## [1] 15

nchar()は文字列の長さを求める関数である.ほかにも検索をしたり,置換したり,分割したり,結合したりといったことができる関数が用意されている.

また,オブジェクトに文字列を格納することもできる.

myName <-"Hidenori Fujino"
myName
## [1] "Hidenori Fujino"
nchar(myName)
## [1] 15

あなたの名前を文字列としてオブジェクトに格納し,print()関数を用いて出力させなさい.またnchar()関数を用いてその文字列の長さを求めなさい.

3

3.1 データの型

オブジェクトにどのようなデータが収められているかによって,そのオブジェクトには「型」と呼ばれる属性が付与される.数値が収められていれば,そのオブジェクトは数値型(Numeric)となるし,文字列が収められていれば文字列型(Character)となる.ほかにも論理型(Logical)や日付型(Date)などいろいろな型がある.

厳密には,オブジェクトに入れていない数値や文字列そのものも,それぞれ数値型や文字列型のデータである.つまり型とはデータそのものに付随する属性であり,オブジェクトの型=その中見のデータの型である.

基本的に型が異なる者同士を計算させることはできない.

a <- 5
b <- "2"
a-b
## Error in a - b: non-numeric argument to binary operator

この例では,bには2ではなく"2"という文字列が格納されている.このため数値‐文字列という形で方の異なるもの同士を計算しようとしたので,エラーとなった.

ただし,関数の場合には,数値でもそのまま文字列をとして扱ってくれるものもある.

a <- 12345
b <- "12345"
nchar(a)
## [1] 5
nchar(b)
## [1] 5

3.2 型の把握

あるオブジェクトがどの型なのかを知るためには,class()関数を用いる.

a <- 12345
b <- "12345"
class(a)
## [1] "numeric"
class(b)
## [1] "character"

3.3 型の変換

たとえば文字列として与えられた数値を数値型に変換して処理したり,逆に数値型として与えられた数値を文字列型に変換したい,といったケースはよくある. その場合,as.numericas.characterといった型変換関数を用いる.

例えば,以下は文字列型の数値を数値型に変換している例である.

a <- 12345
b <- "12345"
a+b # これはエラー
## Error in a + b: non-numeric argument to binary operator
a + as.numeric(b) 
## [1] 24690
  1. 課題1の任意の問題を1つとりあげ,その計算結果を収めたオブジェクトの型をclass()関数を用いて確認しなさい.
  2. その計算結果をas.character()関数を用いて文字列型に変換させたものを別のオブジェクトに格納したうえで,そのオブジェクトの内容をprint()関数を用いて表示させなさい.
  3. もとの計算結果を収めたオブジェクトをprint()関数で表示させたときとどの点で異なっているか,なぜ異なっているかを述べなさい.

このほかにも,型変換関数はたくさんある.as.まで打つと様々な型変換関数がリスト表記される.データ分析でよく使用するものとしてはas.factor()(データを要因型(参考)に変換する)やas.data.frame()(データをデータフレーム型に変換する)などがある.それぞれいずれ出てくるので,頭の片隅に置いておいてほしい.

–>

4 RMakrdown

これまでは命令を1行1行Console中に入力してきた.しかし,色々な処理をさせたり,複雑な処理をさせたりする場合には,命令を1つ1つconsole中に入力して実行していくよりも,命令を別ファイルとして入力し,一気に実行(あるいはある部分だけを実行)する方が作業効率が良い.またそうしておけば,一連の命令をファイルとして保存して,別な時に再度呼び出すことも容易となる.

RStudioでは,RMarkdownファイルというものを作成することができる.RMarkdownファイルは,上記のようにコードを書き込んで実行させることができるし,実行結果やグラフ,文章を含めた文書(HtmlやPDF,あるいはWord文書)を作成することもできる. なお,このRのテキストもRMarkdownを用いて作成しているものである.

4.1 RMarkdownファイルの作成

RMarkdownファイルは,File メニュー-> New File ->R Markdownを選択することで作成できる.

RMarkdownファイルの作成
RMarkdownファイルの作成

そのプロジェクトで初めてRMarkdownファイルを作成する際には,以下のようなWindowが現れるので,「Yes」を選択する.なお,これはRMarkdownファイルを利用するにあたって,いくつかのパッケージをバージョンアップする必要があるので,それらをバージョンアップしてよいかを尋ねてきているものである.

バージョンアップの確認
バージョンアップの確認

4.2 RMarkdownの初期設定

パッケージのバージョンアップが済むと以下のような初期設定のWindowが現れる.このWindowでは,どのような文書を作成するかを選択することができる.

RMarkdownの初期設定
RMarkdownの初期設定

左側のDocumentPresentationShinyFrom Templateのいずれかを選択することで,それぞれの文書を作成することができる. とりあえずはDocumentを選択しおく.右側には以下のものが設定できる.

  • Title:文書のタイトルを入力する.
  • Author:文書の著者名を入力する.
  • Date:文書の作成日を入力する.
  • Defalut Output Format:出力する文書の種類を選択する.
    • HTML:HTML文書を作成する.
    • PDF:PDF文書を作成する.
    • Word:Word文書を作成する.

TitleやAuthor,Dateは自由に設定してよい.Default Output FormatはとりあえずHTMLを選択しておこう.

4.3 RMarkdownの編集

初期設定画面でOKをクリックすると,以下のような例文が記載されたRMarkdownファイルが作成される.

RMarkdownの初期画面
RMarkdownの初期画面

RMarkdownは,テキストセル(背景が白色の部分)とコードセル(背景が灰色の部分)が複数集まって構成される.

テキストセルには文章を入力する.コードセルにはRのスクリプトを入力し,コードを実行するとその結果がコードセルの下に表示される.

4.3.1 コードセルの実行

コードセルの実行方法は,コードを行ごと選択してCtrl+Enterを押すか,コードセルの左上にあるボタン(︎Run Current Chunk)をクリックする.▶︎ボタンで実行する場合,そのコードセルに書かれているすべての行が一気に実行される

実際に,初期画面で表示されている例文の{r car}と書かれたコードセルを実行すると,以下のような出力が得られる. (出力結果の箇所を黄色の線で示している)

コードセルの実行結果
コードセルの実行結果

デフォルトで入力されているコードセルを実行し,その結果を確認しなさい.

4.3.2 コードセルの追加

コードセルを新たに追加する場合には,画面の右の上にある+Cボタンをクリックして「R」を選択するか(下図),Ctrl+Alt+Iを押す,あるいは,自分で直接「```{r}」~「```」と書いてもよい.

コードセルの追加ボタン
コードセルの追加ボタン

個人的にはマウス操作をするのも,ショートカットを覚えるのも面倒なので直接入力することをお勧めする.

ただし,直接記載するときには,

  • ```{r}の前に空白行をいれること
  • ```でコードセルを閉じるのを忘れないこと
  • 閉じる際の```の後に空白行を入れること
  • 開始の```{r}と終了の```はそれぞれ単独の行として,他に何も記載しないこと.

なお,「`」は「バッククォート」と呼び,日本語キーボードではShiftキー+@キー(右小指あたりにある)で入力できる.入力モードが半角入力か全角入力かは注意すること.全角入力の時は「’」と表示される.この形のバッククオートの場合,そのままではバッククオートとしては処理されず,単にテキストセルに「’」という文字が入力されているだけとして処理されるので,半角入力に切り替えてから「`」を入力すること(変換によって「`」にしても良い).

コードセルには名前を振ることができる.例えば,先ほど実行したコードセルでは{r car}という形でcarという名前が付与されていた.このように,{r}のなかに半角スペースを置いて任意の単語を書き込むことで,そのコードセルに名前を付けることができる. 名前を付けておくと,コードセルの実行結果が表示される際に,その名前が表示されるので,どのコードセルがどの結果を出力しているのかがわかりやすくなる.

そのほかにも,例えば,{r, echo=FALSE}と記載すると,knit(後述)した際にそのコードセルのコードが表示されなくなるなど,{r}の中には様々なオプションを記載することができる.

新たにコードセルを追加し,その中で以下の計算を入力,実行させなさい.

  1. 5*4
  2. 12/4
  3. 3^2
  4. 5+3
  5. 5-3

さらに,以下の計算を実行させなさい.

a<- 34
b<- 23
print(a+b)

4.3.3 テキストセルの追加

テキストセルの追加は,そのまま文章を記載していけばよい.記載に当たっては各種のマークダウン記法を利用できる.

代表的な記法を以下に示す.

4.3.3.1 改行

マークダウンでは改行は「空白行」を入れることで反映される.空白行を入れていない場合,たとえ編集画面で改行していても,実際の表示では改行されない.

行1
行2

上記のように記載すると,以下のように表示される.

行1 行2

行1

行2

上記のように記載すると,以下のように表示される.

行1

行2

4.3.3.2 見出し

# 見出し1

## 見出し2

### 見出し3

このように記載することで,以下のような表示が得られる(文字サイズは環境によって多少異なる).

見出し1

見出し2

見出し3

なお,見出しの前後は空白行をいれておくこと.空白行は入っていないと見出しとして機能しない.また「#」と見出し語の間には半角スペースを入れておくこと.半角スペースが入っていない場合は見出しとして処理されなくなる.

4.3.3.3 箇条書き

- 箇条書き1
- 箇条書き2
- 箇条書き3

1. 番号付きリスト1
1. 番号付きリスト2
1. 番号付きリスト3
  • 箇条書き1
  • 箇条書き2
  • 箇条書き3
  1. 番号付きリスト1
  2. 番号付きリスト2
  3. 番号付きリスト3

この場合も箇条書きやリストの開始前,終了後には空白行をいれておくこと.また「-」や「1.」の後にはやはり半角スペースをいれておくこと.

4.3.3.4 強調表現

強調表現1:**太字**にする
強調表現2:*斜体*にする
強調表現3:***太字・斜体***にする

見え消し:~~取り消し線~~を書く

強調表現1:太字にする

強調表現2:斜体にする

強調表現3:太字・斜体にする

見え消し:取り消し線を書く

他にも画像を挿入したり,URLリンクを挿入したり,表を書いたりといった様々な記述が可能である. マークダウン記法自体は,R以外にもさまざまな場面で出てくる記法である.例えば,ChatGPTに与えるプロンプトをマークダウンで記述するとうまく指示を出しやすいといったことがある.興味があれば調べてみたり,ChagGPTなどに「~~~をMarkdwownで記述するには?」といった形で尋ねるとよいだろう.

以下に参考となるページを挙げておく.

Markdown記法 サンプル集

Markdown記法 チートシート

【マークダウン記法とは?】マークダウンの書き方を網羅的に解説

4.4 ヘッダーの記述

RMarkdownファイルの冒頭にはヘッダーが記述されている.例文のままでも特に問題はないが,以下のようなヘッダーにしておくと,dateが自動的に更新されていくほか,目次が追加される.

---
title: "RとRStuidoの基本操作"
author: "藤野秀則,"
date: 
  初版日:2024-05-02
  更新日:`r Sys.Date()`
output:
  html_document: 
    toc: true
    toc_depth: 4
    toc_float: true
---

この部分の記法はYAMLと呼ばれるもので,この部分はRMarkdownファイルのメタデータとして扱われる. 記法そのものを覚えておくのは面倒なので,上記のヘッダーを毎回コピペして,例文のヘッダーを上書きするとよいだろう.

YAMLとは もともとYAMLは”Yet Another Markup Langage”(一応まだもう一つのマークアップ言語)という意味だったが,その後「マークアップ言語ではない」という意味の”YAML Ain’t Markup Language”という意味に変更された.

ここを弄ることで他にも色々と文書の体裁を変えることもできる(例えば,この資料のように見出し番号を付与する等)が,それはかなり応用になるので,この場では省略する.興味のある人は以下のリンクを見てみるとよいだろう.

https://kazutan.github.io/kazutanR/Rmd_intro.html#yamlヘッダの基本

R Markdownのhtml_documentで指定できるyamlヘッダ項目について

(いずれも,2024年9月30日時点で確認)

なお,YAMLの記述ではインデントと:が非常に重要になる.特にインデントが崩れていると機能しなくなるので,全体としてインデントが統一されているか(レベル下げの時の半角スペースの数が統一されているか)に注意しておくこと.

4.5 RMarkdownの保存とKnit

RMarkdownファイルは,スクリプトファイルと同様に保存することができる.さらに保存したRMarkdownファイルは,画面上部の「Knit」ボタンをクリックすることで,選択した出力形式(HTML,PDF,Word)に変換される.

Knitボタン
Knitボタン

実際にこれまでに入力してきた内容(エラーを出力するものを除いている)をRMarkdownで記載すると以下のようになる. (なお,初期設定で入力されている内容は,冒頭のヘッダーと最初のコードセルを除いて削除している.最初のコードセルのみ後で利用するケースがあるので残している)

これまでに入力してきたRのコード
これまでに入力してきたRのコード

これをKnitすると以下のようなwindowが得られる.なお,初回のみ,ファイル名を指定するためのWindowが表示されるので,ファイル名を入力して「Save」をクリックすると,Knitが実行される.

Knitの例
Knitの例

Knitが完了すると,指定した出力形式(今回であればhtml)のファイルが作成され,右下のペインに作成されたhtmlファイルが追加される.このファイルをクリックすることで,作成したhtmlファイルをブラウザで表示することもできる.

RMarkdownファイルを1つ作成し,その中に課題1~4の内容を,それぞれの課題番号を見出しとしたRMarkdown形式で記述して,Knitしてhtmlファイルを作成しなさい.

4.6 RMarkdownファイルを開く

右下の「Files」タブ内に作成したファイルの一覧が表示されている.この中で開きたいファイルを選択すると,そのファイルが開かれる.

5 ファイルのダウンロード

作成したスクリプトファイルやrmdファイル,htmlファイルはあくまでオンライン上に置かれている.手許のパソコンにファイルをダウンロードしたい場合には,左側の「Posit Cloud」と書かれたサイドバーの中の「Your Workspace」をクリックして,プロジェクト管理画面を開く.もしサイドバーを閉じていた場合には,左上にある三本線のマークをクリックするとサイドバーが現れる.

サイドバー
サイドバー

このプロジェクト管理画面の各プロジェクト名の右手にある下向きの矢印のアイコンをクリックすると,プロジェクト全体を圧縮したZipファイルをダウンロードできる.

プロジェクト管理画面
プロジェクト管理画面

ダウンロードしたZipファイルを解凍すると,Posit Cloud上のファイル一式が手許のPCに展開される.

解凍したファイル一式
解凍したファイル一式

6 ここまでで用いられていたR関数

  • sqrt()
    • 説明:平方根を計算する.
    • 引数:平方根を求めたい数値,またはオブジェクト.
  • print()
    • 説明:オブジェクトの内容や指定した文字列をコンソールに表示する.
    • 第1引数:表示させたい数値,文字,オブジェクト.
    • 第2引数:数値を含むオブジェクトの場合に表示させる小数の桁数.digits=で与える.数値を含まないオブジェクトの場合には無視させる.また,数値と数値以外が混在しているデータフレーム型オブジェクトの場合,数値に対してのみ適用される.
  • nchar()
    • 説明:文字列の長さを求める.
    • 引数:文字列,もしくは文字列を格納しているオブジェクト.
  • class()
    • 説明:オブジェクトの型を確認する.
    • 引数:任意のオブジェクト.
  • as.numeric()
    • 説明:文字列型などを数値型に変換する.
    • 引数:文字列として格納されている数字,もしくはそれを格納しているオブジェクト.
  • as.character()
    • 説明:数値型などを文字列型に変換する
    • 引数:数値,もしくはそれを格納しているオブジェクト
  • rm()
    • 説明:特定のオブジェクトをメモリから削除するための関数.
    • 引数:削除したいオブジェクトの名前.
  • ls()
    • 説明:現在の環境に存在するオブジェクトの一覧を表示する.
    • 引数:なし.