LoginSignup
1
1

More than 5 years have passed since last update.

Rのpiperの皆さまに送る、何でもパイプで書いてたらハマった話

Posted at

はじめに

P値を-log10スケールにして、プロットしたい時がある。

p <- 0.01
-log10(p)
## [1] 2

Rのデータ処理で人気のパッケージ{dplyr}を使う人は、パイプ演算子(%>%)を使ってスッキリと書くことが多い。

例えば、

require(dplyr)
p <- seq(1, 10, by = 1) %>% pnorm(., lower.tail = F)
print(p)
##  [1] 1.586553e-01 2.275013e-02 1.349898e-03 3.167124e-05 2.866516e-07
##  [6] 9.865876e-10 1.279813e-12 6.220961e-16 1.128588e-19 7.619853e-24

みたいに書ける。pnorm(seq(1, 10, by = 1), lower.tail = F) より可読性高い。
ドットは省略だけど、ドット付きで評価させることで比較的自由にパイプで書ける。

ここに、対数変換もしたいとする。
ほしいのはこういった値。

-log10(p)
##  [1]  0.7995455  1.6430161  2.8696990  4.4993349  6.5426457  9.0058643
##  [7] 11.8928536 15.2061426 18.9474644 23.1180534

そうだ、パイプで書こう

しかし、パイプ演算子を使って書くとドツボにはまった。

seq(1, 10, by = 1) %>% pnorm(., lower.tail = F) %>% -log10(.)
##  [1]  0.9582008  1.6657662  2.8710489  4.4993666  6.5426460  9.0058643
##  [7] 11.8928536 15.2061426 18.9474644 23.1180534

正解より大きい。

何が起きているのか

次の評価がされてしまっているようだ。

tmp_fun <- function(x){
    x - log10(x)
}
seq(1, 10, by = 1) %>% pnorm(., lower.tail = F) %>% tmp_fun()
##  [1]  0.9582008  1.6657662  2.8710489  4.4993666  6.5426460  9.0058643
##  [7] 11.8928536 15.2061426 18.9474644 23.1180534

最後の評価で、先頭にマイナスをつけなければ、正しい値がでる。

test1 <- seq(1, 10, by = 1) %>% pnorm(., lower.tail = F) %>% log10(.)
test2 <- log10(pnorm(seq(1, 10, by = 1), lower.tail = F))
all(test1 == test2)
## [1] TRUE

最後の評価で、先頭にプラスをつけるとNG(普通こんなふうに書かないと思うけど)

test1 <- seq(1, 10, by = 1) %>% pnorm(., lower.tail = F) %>% +log10(.)
test2 <- log10(pnorm(seq(1, 10, by = 1), lower.tail = F))
all(test1 == test2)
## [1] FALSE

これまでに書いたコードが心配な人へ

Linux User

find使って検索。カレントディレクトリ以下なら、

find ./ -type f -print | xargs grep '%>% -'

Mac User

Finderで "%>% -" とカギ括弧付きで検索すると、それを含むRscriptなり、Rmdファイルを拾える(ポジコンスクリプトで確認済)。

Windows User

Unknown.

備考

見つけたときは焦ったが、過去の解析について、私は特に実害なかった。
グーグル検索で他の人たちのスクリプトを探そうとしたが、%がどうやっても検索できず断念した。

// 以上。

実行環境

sessionInfo()
## R version 3.3.1 (2016-06-21)
## Platform: x86_64-apple-darwin13.4.0 (64-bit)
## Running under: OS X 10.13.5 (unknown)
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] dplyr_0.7.4
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.16      rstudioapi_0.6    bindr_0.1.1      
##  [4] knitr_1.15.1      magrittr_1.5      xtable_1.8-2     
##  [7] R6_2.2.2          rlang_0.1.6       stringr_1.2.0    
## [10] highr_0.6         tools_3.3.1       miniUI_0.1.1     
## [13] htmltools_0.3.5   yaml_2.1.14       rprojroot_1.2    
## [16] digest_0.6.12     assertthat_0.2.0  tibble_1.3.4.9003
## [19] bookdown_0.3      bindrcpp_0.2.2    shiny_1.0.1      
## [22] questionr_0.6.0   glue_1.2.0        evaluate_0.10    
## [25] mime_0.5          rmarkdown_1.8     stringi_1.1.5    
## [28] pillar_0.0.0.9000 rmdformats_0.3.2  backports_1.0.5  
## [31] httpuv_1.3.3      pkgconfig_2.0.1
1
1
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
1