R入門
演算子と制御構文
最終更新:
r-intro
目次
条件演算子(三項演算子)を使う
Rには条件演算子(三項演算子)はなく、ifelse関数で代用することができる。
ifelse(v1, v2, v3)
v1は論理型ベクトルで、v1が真(TRUE)の場合はv2が、偽(FALSE)の場合はv3が戻り値になる。
> n <- 3
> n <- c(1, 2, 3)
> ifelse(n >= 2, c("A", "B", "C"), c("a", "b", "c"))
[1] "a" "B" "C"パイプを使う
dplyrパッケージの%>%演算子を使う。以下はデータAirPassengersの先頭から10個のレコードを表示させるために、%>%演算子によるパイプラインを使用して抽出した例。
> head(AirPassengers)
[1] 112 118 132 129 121 135
> head(AirPassengers, 10)
[1] 112 118 132 129 121 135 148 148 136 119
> AirPassengers %>% head()
AirPassengers %>% head() でエラー:
関数 "%>%" を見つけることができませんでした
> library(dplyr)
> AirPassengers %>% head()
[1] 112 118 132 129 121 135
> AirPassengers %>% head(10)
[1] 112 118 132 129 121 135 148 148 136 119%>%演算子は、次の受け取った出力を次の関数の第一引数に与える。受ける関数は、第一引数を省略して記述すればよい。
> dtf <- data.frame(no = 1:12, month = month.abb)
> head(dtf)
no month
1 1 Jan
2 2 Feb
3 3 Mar
4 4 Apr
5 5 May
6 6 Jun
> subset(dtf, no == 3 | no == 4)
no month
3 3 Mar
4 4 Apr
> dtf %>% subset(no == 3 | no == 4)
no month
3 3 Mar
4 4 Aprパイプを使う
バージョン4.0.5までは標準で搭載されておらず、magrittrパッケージを導入すれば%>%演算子でパイプを実現することができた。この次のバージョン(4.1.0)からはパイプの機能が標準搭載され、|>演算子を使うことでパイプを実現することができる。
> R.Version()$version.string
[1] "R version 4.0.5 (2021-03-31)"
> s <- c("鈴木みのり", "野口瑠璃子", "和多田美咲")
> s |> sort()
エラー: 予想外の '>' です in "s |>"
> library(magrittr)
> s %>% sort()
[1] "野口瑠璃子" "鈴木みのり" "和多田美咲"バージョン4.1.0では以下のとおり。
> R.Version()$version.string
[1] "R version 4.1.0 (2021-05-18)"
> s <- c("鈴木みのり", "野口瑠璃子", "和多田美咲")
> s |> sort()
[1] "野口瑠璃子" "鈴木みのり" "和多田美咲"条件式で条件を設定してエラーを出す
stopifnot関数を使う。引数に与えた一つ以上の式が一つでもFALSEの場合は、エラーを出す。スクリプトでうまく使えばデバッグに利用できる。
> no <- 58
> umamusume <- "メイショウドトウ"
> cv <- "和多田美咲"
> stopifnot(no == 58)
> stopifnot(no == 58, umamusume == "メイショウドトウ")
> stopifnot(no == 58, umamusume == "メイショウドトウ", cv == "石見舞菜香")
エラー: cv == "石見舞菜香" は TRUE ではありません
> for (i in 1:5) {stopifnot(i < 3); cat(i, "\n")}
1
2
エラー: i < 3 は TRUE ではありませんパイプラインを使ってリストの要素を取り出す
magrittrパッケージのextract関数かextract2関数を使う。それぞれ|>演算子(%>%演算子)を使用したパイプラインにおいて、extract関数は[ ]の、extract2関数は[[ ]]のエイリアスとして機能する。
> chara <- c("アストラ", "ヴィタ", "リフ")
> seiyu <- c("遠藤綾", "日笠陽子", "瀬戸麻沙美")
> sakuhin <- c("ゼンレスゾーンゼロ", "崩壊3rd", "スノウブレイク")
> lis <- list(sakuhin = sakuhin, chara = chara, seiyu = seiyu)
> print(lis)
$sakuhin
[1] "ゼンレスゾーンゼロ" "崩壊3rd" "スノウブレイク"
$chara
[1] "アストラ" "ヴィタ" "リフ"
$seiyu
[1] "遠藤綾" "日笠陽子" "瀬戸麻沙美"
> lis[3]
$seiyu
[1] "遠藤綾" "日笠陽子" "瀬戸麻沙美"
> lis |> extract(3)
$seiyu
[1] "遠藤綾" "日笠陽子" "瀬戸麻沙美"
> lis |> extract(3) |> typeof()
[1] "list"
> lis[[3]]
[1] "遠藤綾" "日笠陽子" "瀬戸麻沙美"
> lis |> extract2(3)
[1] "遠藤綾" "日笠陽子" "瀬戸麻沙美"
> lis |> extract2(3) |> typeof()
[1] "character"リストに[ ]を使うと、指定した要素だけからなるリストを返す。[[ ]]は指定した要素を取り出して、その要素の自体を返す。
一行で複数のコマンドを実行する
;(セミコロン)を使う。セミコロンは、コマンドを区切るための記号として機能する。
> n <- 0; n <- n + 2; n <- n ^ 16; print(n)
[1] 65536
> s
エラー: オブジェクト 's' がありません
> s <- "セナディア役の鈴木みのりさん、かわいい"; print(s)
[1] "セナディア役の鈴木みのりさん、かわいい上記は対話型実行環境で手順を減らすための手法であり、これのスクリプト内での使用は推奨しない。
一般に、スクリプトで一行に複数のコマンドを書くことはスクリプトの可読性を著しく損なうことから、スクリプトでは一行一コマンドを徹底すること。