Rのコードを見やすくする(%>%演算子利用)

昨日の記事に書いたRのコードを、%>%(パイプ)演算子を使って見やすく書き直しました。

修正前

## リストからテーブル要素を生成
tags$table(pmap(dl, ~tags$tr(map(list(...), ~tags$td(.x)))))

修正後

dl %>%
    pmap(~tags$tr(map(list(...), ~tags$td(.x)))) %>% # tr要素生成
    tags$table(.)                                    # table要素生成


この記事で使用したRとパッケージのバージョンを記載しておきます。
バージョンが異なると、動作や表示も若干異なる場合があるからです。

  • R 3.6.1
  • htmltools 0.3.6
  • purrr 0.3.2
  • dplyr 0.8.3



背景

昨日書いたRのコードの内、リストからテーブル要素を生成する部分は、ごちゃごちゃしていました。

## リストからテーブル要素を生成
tags$table(pmap(dl, ~tags$tr(map(list(...), ~tags$td(.x)))))

時間が経つとプログラムは把握しずらくなります。さらに、このような複雑な箇所だとなおさらです。

%>%(パイプ)演算子を使うとコードが見やすくなるので、書き直そうと思います。

%>%演算子

%>%演算子を使うと、左側にある変数を右側にある関数の第1引数に渡すことができます。

例:

1:10 %>% plot

上記の例は、こちらと同じ意味です。

plot(1:10)

元々%>%演算子は、magrittrパッケージで導入されました。
現在では、データ整形で良く使うdplyrパッケージでも使えます
この記事でもdplyrパッケージの%>%演算子を使います。

※%>%演算子はpurrrパッケージでも使えます。そのため、dplyrパッケージを読み込む必要はありませんでした。失礼しました。(2019年8月22日)

Rのコードを、%>%(パイプ)演算子を使って書き直す。

前回のコードです。

library(htmltools)
library(purrr)

## データフレームに含められない部分
df <- data.frame(contents = c("https://...1", "https://...2", "https://...3"),
                 href     = c("https://...1", "https://...2", "https://...3"),
                 download = c("filename1", "filename2", "filename3"))
aList <- pmap(df, ~tags$a(list(...)$contents, href = list(...)$href, download = list(...)$download))

## データフレームに含められる部分
df <- data.frame(no = c(1, 2, 3),
                 link = c("site_name_1", "site_name_2", "site_name_3"),
                 stringsAsFactors = FALSE)
dl <- as.list(df)

## 両者を結合
dl <- c(dl, a = list(aList))

## リストからテーブル要素を生成
tags$table(pmap(dl, ~tags$tr(map(list(...), ~tags$td(.x)))))

最後の「リストからテーブル要素を生成」する部分を書き直しましょう

最初に、%>%演算子を使うため、dplyrパッケージを読み込んでおきます。

library(dplyr)

最後の処理は、tr要素生成とtable要素生成の2段階に分かれています。

まず、1つめのtr要素生成部分を%>%演算子を使って修正します。

修正前

pmap(dl, ~tags$tr(map(list(...), ~tags$td(.x))))

修正後

dl %>% pmap(~tags$tr(map(list(...), ~tags$td(.x))))

次に、table要素生成部分です。

同じ考え方で以下のように書くと、エラーになります。

dl %>% pmap(~tags$tr(map(list(...), ~tags$td(.x)))) %>% tags$table
 .$tags でエラー: 
   3 個の引数が '$' に渡されましたが、2 が必要とされています 

エラーになる原因は、引数を渡すべき右辺の関数が正しく認識されていないためです。

このようなときは、%>%演算子によって渡される引数を .(ドット)で明示します。

dl %>% pmap(~tags$tr(map(list(...), ~tags$td(.x)))) %>% tags$table(.)

これで完成ですが、改行し、コメントを付けて、より分かりやすくしましょう。

dl %>%
    pmap(~tags$tr(map(list(...), ~tags$td(.x)))) %>% # tr要素生成
    tags$table(.)                                    # table要素生成

こちらが修正前のコードです。

tags$table(pmap(dl, ~tags$tr(map(list(...), ~tags$td(.x)))))

コードはだいぶ見やすくなり処理内容が把握しやすくなったと思います(私だけ?)。

あと、今回の例は該当しないのですが、%>%演算子を使う利点は他にもあります。
それは、中間変数が不要になる点です。
中間変数を使うと、その変数名をどうするかちょっと考え込んでしまうときがあるので、使わないで済むのは結構助かります。

まとめ

%>%演算子を使って、昨日のコード(の一部)を書き直しました。
%>%演算子はとても便利なので、ぜひ使ってみて下さい。
では。

--
YouTube: ミサキさん

問い合わせ先
Mail: caprico.aries@gmail.com
Twitter: https://twitter.com/caprico_aries(無言フォローもお気軽に)

コメント