LoginSignup
2
2

More than 5 years have passed since last update.

R の パイプライン処理での return について

Posted at

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 する

どちらにしろスッキリ度は下がりますね

2
2
3

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
2
2