felpパッケージでRのヘルプをあいまいに検索しよう

by
カテゴリ:
タグ:

Rでヘルプを見ようにも記憶があいまいだったり、つづりがあやふやで調べようがない経験があるかもしれません。

そこで、あいまいな(fuzzy)キーワードでヘルプを検索するfuzzyhelp関数をfelpパッケージに追加しました。

詳しい使い方は後述しますが、felp::fuzzyhelp()を実行するか、コマンドパレットをCtrl+Shift+Pで開き「Fuzzy Search on R Help」を指定すればすぐに使い始められると思います(参考:RStudioが生産性を高める[前編]〜コマンドパレットによる検索の効率化)。

ぜひ、CRANからfelpパッケージをインストールして使ってみてください。

install.packages("felp")

デモ

あいまいなキーワードによる検索

あいまい検索で有名なfzfアルゴリズムをカスタムしたものを採用しています。

printに対してprntなど、打ち漏らしを許容するアルゴリズムなので、自信のある部分だけを入力して絞り込むといいでしょう。打ち間違えはNGなので、printに対してplintはマッチしません。

S3メソッドの検索

class関数を使ってオブジェクトのクラスを調べておくと、そのオブジェクト向けに定義されたS3メソッドの検索も簡単です。 data.frameクラスであれば、.data.frameと検索してみてください。

クラスとかS3メソッドとはなんぞやという方は以下の説明を読んでください。

S3オブジェクト指向とヘルプの関係

Rの関数の中には、与えたオブジェクトの種類(class)に応じて挙動を変えるものがいます。

print関数がその代表です。

たとえばdata.frame関数はdata.frameクラスのデータフレームを作成します。また、作成したオブジェクトを確認すると、見慣れた表状のデータが表示されます。

# data.frameクラス

# データ作成
x_df <- data.frame(a = runif(5), b = seq(5))

# クラスを確認
print(class(x_df))
#> [1] "data.frame"

# データ表示
print(x_df)
#>           a b
#> 1 0.2655087 1
#> 2 0.3721239 2
#> 3 0.5728534 3
#> 4 0.9082078 4
#> 5 0.2016819 5

これを、tibble::as_tibble関数でTidyverse版データフレームに変換すると、各列の値こそ変わりませんが、表示内容は変わります。

  • 1行目にデータが5行2列のtibbleであると表示(# A tibble: 5 × 2
  • 列名前の下に列ごとのデータの型を表示(<dbl><int>など)
  • 小数点の表示桁数が減る
# tbl_dfクラス

# データ変換
x_tbl <- tibble::as_tibble(x_df)

# 変換前のデータとの同一性を確認
print(x_df == x_tbl)
#>         a    b
#> [1,] TRUE TRUE
#> [2,] TRUE TRUE
#> [3,] TRUE TRUE
#> [4,] TRUE TRUE
#> [5,] TRUE TRUE

# クラスを確認
print(class(x_tbl))
#> [1] "tbl_df"     "tbl"        "data.frame"

# データ表示
print(x_tbl)
#> # A tibble: 5 × 2
#>       a     b
#>   <dbl> <int>
#> 1 0.266     1
#> 2 0.372     2
#> 3 0.573     3
#> 4 0.908     4
#> 5 0.202     5

この変化は、print関数が、受け取ったデータのクラス名に応じて挙動を変えるために起きます。

今回の場合は、x_dfに対してはprint.data.frameが、x_tblに対してはprint.tbl_df関数が使われています。

これらは、呼び出した関数の名前と、与えたデータのクラス名を.で繋いだ名前の関数です。

ここで、print関数を総称関数、print.data.frame関数やprint.tbl_df関数をS3メソッドと呼びます。

このため、データの種類に応じた関数の挙動を知るには、総称関数ではなく、S3メソッドのヘルプを見る必要があります。

VignetteやDemoの検索

検索対象には純粋なHelp以外にVignette(長文形式のドキュメント)やDemoを含んでいます。

現在はどれかに限定して検索するような機能はありませんが、特定のパッケージに関するヘルプ一覧を眺めている時などに、良い出会いがあるやも知れません。

使い方

使い方は以下の通り。

  1. UIを起動
    • felp::fuzzyhelp()を実行するか、コマンドパレットをCtrl+Shift+Pで開き「Fuzzy Search on R Help」を指定する
  2. 検索キーワードを入力
    • あいまい一致するので、typoを気にする必要はありません
    • スペースはキーワードの区切り扱いになります
  3. 検索結果一覧から必要なTopicを選ぶ
    • 一覧のサイズはマウス操作で変更可能
  4. 画面下部でヘルプを閲覧する
  5. UIを終了
    • Doneボタンを押すと、最後にプレビューしているページのヘルプを正式に展開します。RStudioであればHelpタブが表示され、コンソールであればhelp関数が実行されます。
    • Cancelボタンを押すと、何もせずに終了します。

アルゴリズム

ざっと以下の通りです

  1. 入力文字を半角スペースで分割しクエリに指定
  2. パッケージ名とタイトルに対し、各クエリとのあいまい一致度のスコア行列を計算
    • 行数: 検索対象の数
    • 列数: 検索クエリの数
    • 手法:
      • fzfアルゴリズムのボーナス計算を先頭一致と連続一致に限定したもの + 検索対象文字列の長さに応じたペナルティ
      • 参考:fzfのスコア計算を読んでみる
  3. 2つのスコア行列の値をセルごとに比較し、大きい方の値を採用したスコア行列に集計
  4. 集計したスコア行列の行ごとの和をとり、検索対象のスコアを確定
  5. 検索対象をスコアの降順、パッケージ名、タイトルの順にソート

速度向上のため、内部的には検索クエリの文字数が1、2、3以上の3パターンでスコアの算出方法を変えています。

Enjoy!!


  1. よくあるタイポとのことで、ジョークパッケージ化されてます https://github.com/coolbutuseless/geomlime↩︎