4.11 単語をコンマ区切りで結合する

文字列ベクトルを人間の読みやすい形で出力したいとします. 例えば x <- c("apple", "banana", "cherry") について, きっとあなたは [1] "apple" "banana" "cherry" のような R が通常ベクトルを出力する形式は好まず, 代わりに “apple, banana, and cherry” という文字列がほしいのではないでしょうか. R 基本関数には文字列ベクトルを連結して1つにまとめる paste() があります. 例えば paste(x, collapse = ', ') とすれば, 出力は "apple, banana, cherry" となるでしょう. この方法の困ったところは (1) 接続詞 “and” が欠けており, (2) ベクトルの要素が2つだけの場合はコンマを使うべきでない ("apple, banana" ではなく "apple and banana" という出力になるべき) ということです.

knitr::combine_words() 関数は文字列ベクトルの長さにかかわらず, 要素を連結して文にできます. 基本的に, 単語1つに対してはそのまま同じものを返し, “A and B” という2つの単語に対しては "A and B" と返し, 3つ以上なら "A, B, C, ..., Y, and Z" というふうに返します. この関数はさらに出力をカスタマイズするいくつかの引数を持っています. 例えば出力される単語をバッククオートで囲みたいなら, knitr::combine_words(x, before = '`') を使うこともできます. 以下に他の引数についてもさらなる例を示します. これらの出力例から引数の意味がよくわからないのであれば, ヘルプページ ?knitr::combine_words もご覧ください.

v <- c("apple", "banana", "cherry")
knitr::combine_words(v)
## apple, banana, and cherry
knitr::combine_words(v, before = "`", after = "'")
## `apple', `banana', and `cherry'
knitr::combine_words(v, sep = "、", and = "そして")
## apple、banana、そしてcherry
knitr::combine_words(v, sep = " / ", and = "")
## apple / banana / cherry
knitr::combine_words(v[1])  # 単語1つ
## apple
knitr::combine_words(v[1:2])  # 単語2つ
## apple and banana
knitr::combine_words(LETTERS[1:5])
## A, B, C, D, and E

この関数はインライン R コードを使うときに特に使いやすいでしょう. 例えばこのように.

今朝は`r knitr::combine_words(v, sep = '、', and='')`を食べた.