Rではオブジェクト(あるいは変数)と呼ばれる「箱」に計算結果の数値や読み込んだデータ(後で説明する)を格納することができる.オブジェクトに格納しておくと,後からそれらの値やデータを再度利用したくなったときに,いちいち再度計算式を入力したり,データの読み込みをすることなく,オブジェクトを呼び出すだけで,それらの値やデータを呼び出すことができる.
以下の例では5-3
の結果をRes
という名前のオブジェクトに格納し,さらにRes
というオブジェクト名を使ってその中身(計算結果)を呼び出している.
Res <- 5-3
Res
## [1] 2
オブジェクトの内容は,上記のようにオブジェクト名を記載するだけでも出力されるが,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桁まで表示させなさい.
オブジェクトに格納された値は,そのままオブジェクト名で計算させることもできる.先ほどRes
には2
が格納(代入ともいう)されているので,以下の計算は10となる.
8+Res
## [1] 10
オブジェクト名はどのような名前でも構わない.日本語も用いることができる.大文字と小文字は区別される.ただし,半角スペースや演算子に用いられている記号,アットマーク記号@
などは利用することができない.また,数字から始まる名前を付けることも不可である(名前の途中に数字が入っている分には問題ない).
ピリオド.
やアンダーバー_
は利用できる.一般的には,複数の単語を連結させて用いる場合には_
で区切る..
は階層性を持ったデータを区別する使われる.以下はそれらの例.
my_res <- 9-4
my_res.power <- my_res ^3
なお,間違えた名前で呼び出すと,もしその名前のオブジェクトが他にないのであれば以下のようなエラーが帰ってくる.
RES
## Error: object 'RES' not found
「オブジェクトが見つかりません」ということで,このエラーが帰ってきたら,オブジェクト名が間違えているかを確認してほしい.
ただし,オブジェクト名を間違えていた時に,間違えた名前と同一の名前のオブジェクトが別に存在していた場合には,このようなエラーは帰って来ずに,そのまま間違えたオブジェクトを使って続く処理が実行されていくので,その場合には自分で間違いに気づきにくくなる.RStduioではすでに使われているオブジェクト名であれば,最初の数文字を入力するとリスト表示してくれる入力支援機能があるので,オブジェクトが増えてきたときにはそれを是非利用して入力するとよい.
一度設定したオブジェクトに新たな値を代入することもできる.以下の例では,my_res
オブジェクトに5
を代入している.
my_res <- 5
my_res
## [1] 5
この際、最初に代入したものが数値であっても、後から文字列を代入することもできる。以下の例では、5が入っているmy_res
オブジェクトに"Hello World."
という文字列を代入している。
my_res <- "Hello World."
my_res
## [1] "Hello World."
作ったオブジェクトは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"
b
とc
が除かれたのが確認できる.
なお,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()関数を用いてその内容を出力させないさい.なお,それぞれのオブジェクト名は好きな名前をつけて構わない.
これまで数値ばかりを扱ってきたが,Rでは数値だけでなく文字列を扱うこともできる.
nchar("Hidenori Fujino")
## [1] 15
nchar()
は文字列の長さを求める関数である.ほかにも検索をしたり,置換したり,分割したり,結合したりといったことができる関数が用意されている.
また,オブジェクトに文字列を格納することもできる.
myName <-"Hidenori Fujino"
myName
## [1] "Hidenori Fujino"
nchar(myName)
## [1] 15
あなたの名前を文字列としてオブジェクトに格納し,print()関数を用いて出力させなさい.またnchar()関数を用いてその文字列の長さを求めなさい.
オブジェクトにどのようなデータが収められているかによって,そのオブジェクトには「型」と呼ばれる属性が付与される.数値が収められていれば,そのオブジェクトは数値型(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
あるオブジェクトがどの型なのかを知るためには,class()
関数を用いる.
a <- 12345
b <- "12345"
class(a)
## [1] "numeric"
class(b)
## [1] "character"
たとえば文字列として与えられた数値を数値型に変換して処理したり,逆に数値型として与えられた数値を文字列型に変換したい,といったケースはよくある.
その場合,as.numeric
やas.character
といった型変換関数を用いる.
例えば,以下は文字列型の数値を数値型に変換している例である.
a <- 12345
b <- "12345"
a+b # これはエラー
## Error in a + b: non-numeric argument to binary operator
a + as.numeric(b)
## [1] 24690
このほかにも,型変換関数はたくさんある.as.
まで打つと様々な型変換関数がリスト表記される.データ分析でよく使用するものとしてはas.factor()
(データを要因型(参考)に変換する)やas.data.frame()
(データをデータフレーム型に変換する)などがある.それぞれいずれ出てくるので,頭の片隅に置いておいてほしい.
–>
これまでは命令を1行1行Console中に入力してきた.しかし,色々な処理をさせたり,複雑な処理をさせたりする場合には,命令を1つ1つconsole中に入力して実行していくよりも,命令を別ファイルとして入力し,一気に実行(あるいはある部分だけを実行)する方が作業効率が良い.またそうしておけば,一連の命令をファイルとして保存して,別な時に再度呼び出すことも容易となる.
RStudioでは,RMarkdownファイルというものを作成することができる.RMarkdownファイルは,上記のようにコードを書き込んで実行させることができるし,実行結果やグラフ,文章を含めた文書(HtmlやPDF,あるいはWord文書)を作成することもできる. なお,このRのテキストもRMarkdownを用いて作成しているものである.
RMarkdownファイルは,File メニュー-> New File ->R Markdownを選択することで作成できる.
そのプロジェクトで初めてRMarkdownファイルを作成する際には,以下のようなWindowが現れるので,「Yes」を選択する.なお,これはRMarkdownファイルを利用するにあたって,いくつかのパッケージをバージョンアップする必要があるので,それらをバージョンアップしてよいかを尋ねてきているものである.
パッケージのバージョンアップが済むと以下のような初期設定のWindowが現れる.このWindowでは,どのような文書を作成するかを選択することができる.
左側のDocument
,Presentation
,Shiny
,From Template
のいずれかを選択することで,それぞれの文書を作成することができる.
とりあえずはDocument
を選択しおく.右側には以下のものが設定できる.
TitleやAuthor,Dateは自由に設定してよい.Default Output
FormatはとりあえずHTML
を選択しておこう.
初期設定画面でOK
をクリックすると,以下のような例文が記載されたRMarkdownファイルが作成される.
RMarkdownは,テキストセル(背景が白色の部分)とコードセル(背景が灰色の部分)が複数集まって構成される.
テキストセルには文章を入力する.コードセルにはRのスクリプトを入力し,コードを実行するとその結果がコードセルの下に表示される.
コードセルの実行方法は,コードを行ごと選択してCtrl
+Enter
を押すか,コードセルの左上にある▶
ボタン(︎Run
Current
Chunk)をクリックする.▶︎ボタンで実行する場合,そのコードセルに書かれているすべての行が一気に実行される
実際に,初期画面で表示されている例文の{r car}
と書かれたコードセルを実行すると,以下のような出力が得られる.
(出力結果の箇所を黄色の線で示している)
デフォルトで入力されているコードセルを実行し,その結果を確認しなさい.
コードセルを新たに追加する場合には,画面の右の上にある+C
ボタンをクリックして「R」を選択するか(下図),Ctrl
+Alt
+I
を押す,あるいは,自分で直接「```{r}」~「```」と書いてもよい.
個人的にはマウス操作をするのも,ショートカットを覚えるのも面倒なので直接入力することをお勧めする.
ただし,直接記載するときには,
なお,「`」は「バッククォート」と呼び,日本語キーボードではShift
キー+@
キー(右小指あたりにある)で入力できる.入力モードが半角入力か全角入力かは注意すること.全角入力の時は「’」と表示される.この形のバッククオートの場合,そのままではバッククオートとしては処理されず,単にテキストセルに「’」という文字が入力されているだけとして処理されるので,半角入力に切り替えてから「`」を入力すること(変換によって「`」にしても良い).
コードセルには名前を振ることができる.例えば,先ほど実行したコードセルでは{r car}
という形でcarという名前が付与されていた.このように,{r}
のなかに半角スペースを置いて任意の単語を書き込むことで,そのコードセルに名前を付けることができる.
名前を付けておくと,コードセルの実行結果が表示される際に,その名前が表示されるので,どのコードセルがどの結果を出力しているのかがわかりやすくなる.
そのほかにも,例えば,{r, echo=FALSE}
と記載すると,knit(後述)した際にそのコードセルのコードが表示されなくなるなど,{r}
の中には様々なオプションを記載することができる.
新たにコードセルを追加し,その中で以下の計算を入力,実行させなさい.
さらに,以下の計算を実行させなさい.
a<- 34
b<- 23
print(a+b)
テキストセルの追加は,そのまま文章を記載していけばよい.記載に当たっては各種のマークダウン記法を利用できる.
代表的な記法を以下に示す.
マークダウンでは改行は「空白行」を入れることで反映される.空白行を入れていない場合,たとえ編集画面で改行していても,実際の表示では改行されない.
行1
行2
上記のように記載すると,以下のように表示される.
行1 行2
行1
行2
上記のように記載すると,以下のように表示される.
行1
行2
# 見出し1
## 見出し2
### 見出し3
このように記載することで,以下のような表示が得られる(文字サイズは環境によって多少異なる).
見出し1
見出し2
見出し3
なお,見出しの前後は空白行をいれておくこと.空白行は入っていないと見出しとして機能しない.また「#」と見出し語の間には半角スペースを入れておくこと.半角スペースが入っていない場合は見出しとして処理されなくなる.
- 箇条書き1
- 箇条書き2
- 箇条書き3
1. 番号付きリスト1
1. 番号付きリスト2
1. 番号付きリスト3
この場合も箇条書きやリストの開始前,終了後には空白行をいれておくこと.また「-」や「1.」の後にはやはり半角スペースをいれておくこと.
強調表現1:**太字**にする
強調表現2:*斜体*にする
強調表現3:***太字・斜体***にする
見え消し:~~取り消し線~~を書く
強調表現1:太字にする
強調表現2:斜体にする
強調表現3:太字・斜体にする
見え消し:取り消し線を書く
他にも画像を挿入したり,URLリンクを挿入したり,表を書いたりといった様々な記述が可能である. マークダウン記法自体は,R以外にもさまざまな場面で出てくる記法である.例えば,ChatGPTに与えるプロンプトをマークダウンで記述するとうまく指示を出しやすいといったことがある.興味があれば調べてみたり,ChagGPTなどに「~~~をMarkdwownで記述するには?」といった形で尋ねるとよいだろう.
以下に参考となるページを挙げておく.
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ファイルのメタデータとして扱われる. 記法そのものを覚えておくのは面倒なので,上記のヘッダーを毎回コピペして,例文のヘッダーを上書きするとよいだろう.
ここを弄ることで他にも色々と文書の体裁を変えることもできる(例えば,この資料のように見出し番号を付与する等)が,それはかなり応用になるので,この場では省略する.興味のある人は以下のリンクを見てみるとよいだろう.
https://kazutan.github.io/kazutanR/Rmd_intro.html#yamlヘッダの基本
R Markdownのhtml_documentで指定できるyamlヘッダ項目について
(いずれも,2024年9月30日時点で確認)
なお,YAMLの記述ではインデントと:
が非常に重要になる.特にインデントが崩れていると機能しなくなるので,全体としてインデントが統一されているか(レベル下げの時の半角スペースの数が統一されているか)に注意しておくこと.
RMarkdownファイルは,スクリプトファイルと同様に保存することができる.さらに保存したRMarkdownファイルは,画面上部の「Knit」ボタンをクリックすることで,選択した出力形式(HTML,PDF,Word)に変換される.
実際にこれまでに入力してきた内容(エラーを出力するものを除いている)をRMarkdownで記載すると以下のようになる. (なお,初期設定で入力されている内容は,冒頭のヘッダーと最初のコードセルを除いて削除している.最初のコードセルのみ後で利用するケースがあるので残している)
これをKnitすると以下のようなwindowが得られる.なお,初回のみ,ファイル名を指定するためのWindowが表示されるので,ファイル名を入力して「Save」をクリックすると,Knitが実行される.
Knitが完了すると,指定した出力形式(今回であればhtml)のファイルが作成され,右下のペインに作成されたhtmlファイルが追加される.このファイルをクリックすることで,作成したhtmlファイルをブラウザで表示することもできる.
RMarkdownファイルを1つ作成し,その中に課題1~4の内容を,それぞれの課題番号を見出しとしたRMarkdown形式で記述して,Knitしてhtmlファイルを作成しなさい.
右下の「Files」タブ内に作成したファイルの一覧が表示されている.この中で開きたいファイルを選択すると,そのファイルが開かれる.
作成したスクリプトファイルやrmdファイル,htmlファイルはあくまでオンライン上に置かれている.手許のパソコンにファイルをダウンロードしたい場合には,左側の「Posit Cloud」と書かれたサイドバーの中の「Your Workspace」をクリックして,プロジェクト管理画面を開く.もしサイドバーを閉じていた場合には,左上にある三本線のマークをクリックするとサイドバーが現れる.
このプロジェクト管理画面の各プロジェクト名の右手にある下向きの矢印のアイコンをクリックすると,プロジェクト全体を圧縮したZipファイルをダウンロードできる.
ダウンロードしたZipファイルを解凍すると,Posit Cloud上のファイル一式が手許のPCに展開される.