Rコードの見栄えを向上！flairパッケージの紹介と活用方法

# flairパッケージ

Rmdファイルのドキュメントチャンクは、HTMLタグで文字を強調したり、赤色にしたりできますが、flairパッケージを使えば、コードチャンクの中身さえも強調することもできます。研究結果の公表の際や、Rの講義、ワークショップなどの際に、任意のコードを強調できると便利だと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/15e8291b-84f8-1454-c4f6-5f80a61e5d8c.png)

## インストール
- [著者のパッケージのチュートリアルページ](https://r-for-educators.github.io/flair/index.html)にgithubからのインストールが書いてあったので、その方法で開発バージョンをインストールしました。

```R
# install.packages("devtools")
devtools::install_github("kbodwin/flair")
```
## インストールできなかった方へ
上のコードだと以下のメッセージが出てインストールできませんでした。
```{}
 file.rename(instdir, final_instdir) で警告がありました: 
  cannot rename file 'C:/Users/xxx/Documents/R/win-library/4.1/00LOCK-flair/00new/flair' to 'C:/Users/xxx/Documents/R/win-library/4.1/flair', reason 'アクセスが拒否されました。'
ERROR:    moving to final location failed
* removing 'C:/Users/xxx/Documents/R/win-library/4.1/flair'
Warning message:
In i.p(...) :
  installation of package ‘C:/Users/xxx/AppData/Local/Temp/RtmpK2uykM/file1fa87d8f72a4/flair_0.0.2.tar.gz’ had non-zero exit status
```

同じくできなかった方は、```INSTALL_opts = c('--no-lock')```を引数に追加してみてください（参考：[R: ps package R install error : ERROR: moving to final location failed](https://kanosuke.hatenadiary.jp/entry/2019/05/13/210000)）。

```R
devtools::install_github("kbodwin/flair", INSTALL_opts = c('--no-lock'))
```
## 活用方法
[著者の紹介ページ](https://r-for-educators.github.io/flair/index.html)のチュートリアルを参考に、使い方を紹介します。お手元にRmdファイルを準備してください。

### パッケージの読み込み
```R
library(flair)
library(tidyverse)
```

チャンク内のコードをハイライトするためには、チャンクに名前を付け、そして別のチャンクで強調の設定を行います。今回は"how_to_pipe"とチャンクに名前を付けています。

\```{r how_to_pipe}
iris %>% 
  group_by(Species) %>%
  summarize(mean(Sepal.Length))
\```

:::note warn
Rmdファイル内に同一のチャンク名が複数あるとエラーになります。
:::


### パッケージ内の関数
このパッケージ内の関数の一覧を見てみたいと思います。

```R
# 1. パッケージのエクスポートされたすべてのオブジェクトを取得
exported_objects <- getNamespaceExports("flair")

# 2. 関数のみをフィルタリングして表示
exported_functions <- exported_objects[sapply(exported_objects, function(x) is.function(get(x, envir = asNamespace("flair"))))]

# 結果を表示
print(exported_functions)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/901104f9-2f4d-f58f-2e9a-ccb963768e3d.png)

結構ありますね。[R documentation]()や以下のコードを走らせると、それぞれの関数の説明が見られます（参考：[［R］パッケージに含まれる関数一覧を得る](http://goldenstate.cocolog-nifty.com/blog/2020/08/post-5ebee8.html)）。

```R
help(package = flair)
```

# 関数の使い方

## 指定した文字列のハイライト
```decorate```関数で、ハイライトしたいチャンクを指定します。パイプで渡せるのが楽です。```flair```関数では、文字で指定したものをハイライトします。デフォルトは黄色のハイライトです。

```R
decorate("how_to_pipe") %>% 
  flair("%>%")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/b6d8ded8-b956-403b-a4fe-d0bb2146871f.png)

## 強調方法の各種指定

:::note
以下で紹介する他の関数にも適用できます。
:::

### 文字色の変更。
引数に```color```を追加

```R
decorate("how_to_pipe") %>% 
  flair("%>%", color = "Blue")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/f1ee9b9a-63fe-760b-0450-b96ef06b6c71.png)


### ハイライトの色の変更はこちら
引数に```background```を追加

```R
decorate("how_to_pipe") %>% 
  flair("%>%", color = "Blue", background = "lightblue")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/f920ee3c-694b-0d5f-2d07-8e9289a75e33.png)

### 下線を引く
引数に```underline```を追加
```R
decorate("how_to_pipe") %>% 
  flair("%>%", color = "Blue", background = "lightblue", underline = T)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/a83a9328-5f44-daf9-b626-78a9be4b51ce.png)

### 文字をでかくする
引数に```size```を追加
```R
decorate("how_to_pipe") %>% 
  flair("%>%", color = "Blue", background = "lightblue", underline = T,
        size = "large")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/44f2edd1-f51a-dcdf-6bf7-42c152e7176c.png)


## 関数をハイライト
```flair_funs```関数を使うと、関数を識別して、チャンク内の関数に色を塗ってくれます。

```R
decorate("how_to_pipe") %>% 
  flair_funs(color = "Blue", background = "lightblue")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/9a1f640a-97ce-f5a1-fc07-9dba4b2bd5f0.png)

## 関数に入れたものをハイライト
```flair_input_vals```関数内で指定した変数のハイライトもできます。関数を入れ子にしていると、その中の関数にも色が入るので、この場合は下で示す正規表現を使い、指定する方がいいかもしれません。

```R
decorate("how_to_pipe") %>% 
  flair_input_vals(background = "lightblue")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/25c51e5d-0873-38f7-b1b5-a1d514eb8dfd.png)


## 該当行をハイライト
```flair_lines```関数では、色やハイライト方法は指定できないようです。つまり、常に黄色のハイライトになります。今後のバージョンアップに期待です。

```R
decorate('how_to_pipe') %>%
  flair_lines(2:3) 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/8143e776-eaa0-147b-d38c-aebefd7b82a9.png)


## 正規表現での指定も可能です
```R
decorate("how_to_pipe") %>%
  flair_rx("[A-z]*\\.Length", background = "lightblue")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/306d33b5-bdbe-dfa1-3a4f-5a0f483a374e.png)


## チャンク内なら何でもハイライトできます
コメントは、チャンク外よりも目立ちにくいですが、この問題を解決できますね。
まずコメント付きのチャンクを作ります。

\```{r how_to_pipe_withcomment}
iris %>%          # %>%はパイプです
  group_by(Species) %>%  # summarizeの前にこの命令を忘れないように
  summarize(mean(Sepal.Length)) # Speciesごとに、Sepal.Lengthの平均を計算しています
\```

正規表現でコメントの箇所を指定します。

```R
decorate('how_to_pipe_withcomment') %>%
  flair_rx("#.+", background = "white", 
        color = "black",
        size = "large")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/488110a8-fa63-09e4-9524-f3a7b1d3204f.png)

## いろんなハイライトを詰め込むこともできます
```R

decorate('how_to_pipe') %>%
  flair("%>%", background = "grey") %>%
  flair("Sepal.Length", background = "lightblue") %>%
  flair("Species", color = "CornflowerBlue") %>%
  flair_funs(color = "Blue", background = "orange")

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/265d89f7-edbc-c242-c372-5a4895dc5685.png)


# 参考資料

- [flair](https://r-for-educators.github.io/flair/index.html)
- [R: ps package R install error : ERROR: moving to final location failed](https://kanosuke.hatenadiary.jp/entry/2019/05/13/210000)
- [［R］パッケージに含まれる関数一覧を得る](http://goldenstate.cocolog-nifty.com/blog/2020/08/post-5ebee8.html)