1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

R 二項演算子で文字列を結合する

Last updated at Posted at 2020-12-02

Rでは二項演算子で文字列の結合が出来ない

Pythonでは+演算子で文字列の結合が出来ますが、Rでは出来ません。Rで文字列の結合を行う際には、pasteあるいはpaste0またはstringr::str_cなどを使う必要があります。
しかし、変数を使って文字列を生成したいときなどには関数内の引数として結合する要素を指定しなければならないため、たまに使い勝手が悪いです。

example.R
# プロットのキャプション用の文字列
N <- 100
paste0("データ数は", N, "個である。")
### [1] "データ数は100個である。"

# 以下のように書きたいが、それは出来ない 
"データ数は" + N + "個である。"
###  "データ数は" + N でエラー:  二項演算子の引数が数値ではありません 

Rでも二項演算子で文字列を結合したい!

解決法:文字列を結合する二項演算子を自分で定義する

**なければ作っちゃえ!**が一つの解決法になります。

実はRでは二項演算子を定義することが出来ます。以下のサイトで例が紹介されています。

RjpWIKI:二項演算子定義の例

簡単に言ってしまえば、%~%の形の演算子に対して引数を2つとる関数を割り当てることが出来ます。この形でお気づきかもしれませんが、たしかmagrittrのパイプ演算子(%>% etc.)もこれを利用して作られています。

これを利用すると、

example.R
"%s+%" <- function(x, y) paste0(x, y)

"データ数は" %s+% N %s+% "個である。"
### [1] "データ数は100個である。"

のように定義した二項演算子%s+%で文字列を結合することが出来ます。めっちゃ便利!
ちなみにベクトルを引数としてとった場合には、

example.R
"データ数は" %s+% c(10, 100, 1000) %s+% "個である。"
### [1] "データ数は10個である。"   "データ数は100個である。" 
### [3] "データ数は1000個である。"

"データ数は" %s+% c(10, 100, 1000) %s+% c("だった。", "。", "個である。")
### [1] "データ数は10だった。"     "データ数は100。"         
### [3] "データ数は1000個である。"

のようになります。定義する際にオプションをうまく指定すれば、いい感じに使い勝手が良くなるのではと思います。

上記サイトの例では上書き代入や永続代入をしていて危なっかしい気もしますが、paste0であれば2つの文字列を結合して文字列を返すだけなので割と安心です。


ちょっと裏技的になってしまいますが、コードの可読性や対話的に作業する際の利便性の向上には役立ちそうです。挙動には十分注意する必要がありそうですが、興味があったらぜひ試してみてください!

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?