importasパッケージでPython風にパッケージを使おう

カテゴリ: R

Rアドベントカレンダー、12/21の記事です。 Rmd関連のつもりでしたが、時間がないので、最近作ったimportasパッケージのネタに走ることにしました。

importasパッケージでは、Pythonにおけるimport numpy as npみたいなことが、Rでできるようになります。 Pythonではimportしたライブラリにドットを繋ぐ形で、関数の呼び出しを行います(例えばnp.mean)。同様に、importasパッケージではggplot2 %as% ggなどとパッケージ名を省略し、$演算子を用いて関数を呼び出します(例えばgg$ggplot)。

Rには関数の名前が衝突しないように、パッケージ::関数という記法を愛用する一派がいます。しかし、パッケージ名が長いと行が長くなりがち……。そんな問題をimportasパッケージで解決しましょう!

インストール

GitHubからインストールして下さい。 CRANには投稿済みですが、なかなかお返事が来ません。

remotes::install_github("atusy/importas")

使ってみる

一つずつimportする

%as%演算子を使うと、パッケージ名の略称を定義できます。例えばggplot2パッケージをggと省略してみましょう。

library(importas)
ggplot2 %as% gg

gg$ggplot(mtcars) +
  gg$aes(wt, mpg) +
  gg$geom_point()

ggplot2パッケージの略称を定義しているだけで、読み込んでいるわけではないことに注意して下さい。例えば単にggplot関数を呼び出すとエラーになります。

ggplot
## Error in eval(expr, envir, enclos): object 'ggplot' not found

複数を一度にimportする

importas関数を用いると、複数のパッケージの略称を一度に定義できます。例えばdplyrパッケージをdptidyrパッケージをtdなどと略してみましょう。

importas(dp = dplyr, td = tidyr, ts = tidyselect)

# dplyrを読み込んだわけではないので、
# パイプ演算子を明示的に読み込む必要がある
`%>%` <- magrittr::`%>%`

iris %>%
  head %>%
  dp$select(-Species) %>%
  td$pivot_longer(ts$everything())
## # A tibble: 24 x 2
##    name         value
##    <chr>        <dbl>
##  1 Sepal.Length   5.1
##  2 Sepal.Width    3.5
##  3 Petal.Length   1.4
##  4 Petal.Width    0.2
##  5 Sepal.Length   4.9
##  6 Sepal.Width    3  
##  7 Petal.Length   1.4
##  8 Petal.Width    0.2
##  9 Sepal.Length   4.7
## 10 Sepal.Width    3.2
## # … with 14 more rows

実はexportされていない関数も使えちゃう

従って、::の代替というよりは:::の代替に近いところがあります。ちょっと注意が必要かも。

dp$mutate.tbl_df
## function (.data, ...) 
## {
##     dots <- enquos(..., .named = TRUE)
##     mutate_impl(.data, dots, caller_env())
## }
## <bytecode: 0x5562b3cbd6e8>
## <environment: namespace:dplyr>

Enjoy