6
5

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 5 years have passed since last update.

%>%で試行錯誤する時はreturnで終わろう

Posted at

%>%って?

dplyr(厳密にはmagrittr)というライブラリを導入することで使えるRでパイプラインを実現する中置演算子。

plot(density(iris$Sepal.Length))

は、

「iris(アヤメ)のSepal.Length(萼片長)についてdensityでカーネル密度を計算して、結果をplotする」

に相当するが、頭で考える流れとコードの流れが見事に逆であることが分かる。

これが%>%を使うと

library(dplyr)

iris$Species %>%
  density %>%
  plot

と思考と調和的な流れでコーディングでき、%>%でほどよく改行でき、とても読み易くなりデバグも用意になる。。

もう少し詳しいところはkilometerさんが先日のTokyo.Rで綺麗に図解してくださったので、そちらを参照して頂きたい。

hoge %>% returnで便利に

コーディングしていると

この処理をなくしたい!
処理の順番を変えたい!

といったことが往々にして起きる。
最終行以外はコメントアウトやカットアンドペーストで一発だ。

しかし、最終行が対象になると手間が増える。
たとえば、アヤメデータをフィルタリングするため

iris %>% 
  filter(Sepal.Length > 5) %>% #萼片長が5以上
  filter(Species == 'setosa' %>% #setosa種

とした時、やっぱSpeciesはフィルタリングしなくていいとなると

  1. 3行目を消す(orコメントアウトする)
  2. 2行目の末尾のパイプラインを消す(orコメントアウトする)

といったステップを踏むことになる(以下)。

iris %>% 
  filter(Sepal.Length > 5) # %>% #萼片長が5以上
  # filter(Species == 'setosa' %>% #setosa種

ところが、予めreturnで終わっておくと以下のように3行目をコメントアウトするだけでよい。

iris %>% 
  filter(Sepal.Length > 5) %>% #萼片長が5以上
  # filter(Species == 'setosa' %>% #setosa種
  return()

3行目をコメントアウトするだけでよい。

RStudioユーザーであればCtrl + Shift + Cで行をコメントアウトできるので便利だ。
しかも適切にインデントしてくれる。

hoge %>% str %>% returnで更に便利に

strを使うと、オブジェクトの構造が分かる。
デバグに便利。

iris %>%
  select(-Species) %>%
  scale() %>%
  lm(Sepal.Length ~ ., data = .)

は失敗する。
scaleの返り値がマトリクスで、データフレームではないからだ。

iris %>%
  select(-Species) %>%
  scale() %>%
  lm(Sepal.Length ~ ., data = .) %>%
  str() %>%
  return()

としておくと、

iris %>%
  select(-Species) %>%
  scale() %>%
  # lm(Sepal.Length ~ ., data = .) %>%
  str() %>%
  return()

任意行をコメントアウトした時の結果の構造を見ることができる。
そして、あ、scaleの返り値はmatrixなのかと気付くと,as.data.frame %>%を挿入してstr %>%をコメントアウトすればいい。

iris %>%
  select(-Species) %>%
  scale() %>%
  as.data.frame %>%
  lm(Sepal.Length ~ ., data = .) %>%
  # str() %>%
  return()

この長さのパイプラインでは大したことがないが、長くなればなるほど便利だ。

iris %>%
  select(-Species) %>%
  # scale() %>%
  # as.data.frame %>%
  # lm(Sepal.Length ~ ., data = .) %>%
  str() %>%
  return()

とほとんどをコメントアウトして、うまくいっていることを確認したら一行ずつコメントアウトを取り消し、strを見ることを繰り返して最後にstrをコメントアウトするといったデバグができる。

6
5
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
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?