R って良いな♪ と思わせる要素の一つに
パイプライン処理があります(magrittrなどが必要ですが)
そんな便利なパイプライン処理ですが、
return 関数を用いる際は気を付けなければいけません。
注意
根本的に解決したとかではなく、こういった問題があるよといった注意喚起です。
むしろ詳しい方に教えてほしいです。
環境
Rstudio on Docker toolbox on Windows 10 です。
> version
_
platform x86_64-pc-linux-gnu
arch x86_64
os linux-gnu
system x86_64, linux-gnu
status
major 3
minor 3.3
year 2017
month 03
day 06
svn rev 72310
language R
version.string R version 3.3.3 (2017-03-06)
パッケージは以下の通りです。
- magrittr 1.5
- dplyr 0.5.0
問題
library(dplyr)
samplefunc1 <- function() {
TRUE %>% return
FALSE %>% return
}
samplefunc2 <- function() {
return(TRUE)
return(FALSE)
}
samplefunc1()
samplefunc2()
上記を実行すると以下のようになります。
> samplefunc1()
[1] FALSE
> samplefunc2()
[1] TRUE
!?
パイプライン処理のreturnでは関数が終わらないことが確認できます。
なぜなになでしこです。
ググってみると、以下のようなissueが出てきましたが、まだクローズされてません…
https://github.com/tidyverse/magrittr/issues/32
もしくは何か実装方針(思想)があるのでしょうか…分かりません…
結論
以下のいずれかで統一したほうが混乱しなさそうです。
- return 関数はパイプライン処理内に書かない
- 例
return(x %>% group_by(a) %>% min)
- 例
- 返す値を決めて関数の最後でのみreturn する
どちらにしろスッキリ度は下がりますね