Quantcast
Channel: プログラミング
Viewing all articles
Browse latest Browse all 8415

R conflicted 1.2.0の和訳・改変 - potisanのプログラミングメモ

$
0
0

Rのパッケージconflicted 1.2.0の添付文書和訳です。conflictedはHadley Wickham氏の作成した衝突回避の素晴らしいパッケージで、衝突検出ばかりでなく優先順位の指定も可能です。

添付文書のライセンスはMITライセンスですが、原文の権利はHadley Wickham氏と貢献者方にあります。翻訳文の使用は自己責任です。

Read Me

conflictedパッケージの目的は衝突を解決する代替案の提供です。R既定の衝突解決システムは最後に読み込んだパッケージに優先権を与えます。この動作は衝突の検出を難しくして、場合によっては既存パッケージの更新による衝突が生まれます。conflictedパッケージはR既定とは異なるアプローチを採ります。即ち、すべての衝突をエラーとみなし、使用する関数の選択を強制します。

素晴らしいアイデアをくれた@krlmlrに感謝します!このコードはかつて実験的なstrictパッケージの一部でしたが、衝突解決の改善は単独のパッケージとして便利で価値があると判断して分離しました。

インストール

# install.packages("devtools")
devtools::install_github("r-lib/conflicted")

使い方

conflictedパッケージは読み込むだけで使用できます。

library(conflicted)library(dplyr)filter(mtcars, cyl ==8)#> Error:#> ! [conflicted] filter found in 2 packages.#> Either pick the one you want with `::`:#> • dplyr::filter#> • stats::filter#> Or declare a preference with `conflicts_prefer()`:#> • `conflicts_prefer(dplyr::filter)`#> • `conflicts_prefer(stats::filter)`

衝突した関数は上の提案のように名前空間を指定して呼び出せます。

dplyr::filter(mtcars, am & cyl ==8)#>                 mpg cyl disp  hp drat   wt qsec vs am gear carb#> Ford Pantera L 15.8   8  351 264 4.22 3.17 14.5  0  1    5    4#> Maserati Bora  15.0   8  301 335 3.54 3.57 14.6  0  1    5    8

あるいはセッション単位で優先する関数を指定できます。

conflicts_prefer(dplyr::filter())#> [conflicted] Will prefer dplyr::filter over any other package.filter(mtcars, am & cyl ==8)#>                 mpg cyl disp  hp drat   wt qsec vs am gear carb#> Ford Pantera L 15.8   8  351 264 4.22 3.17 14.5  0  1    5    4#> Maserati Bora  15.0   8  301 335 3.54 3.57 14.6  0  1    5    8

推奨は対応するlibrary(...)の直後に指定することです。

library(dplyr)conflicts_prefer(dplyr::filter)

現在のセッションにおけるすべての衝突を報告できます。

conflict_scout()#> 2 conflicts#> • `filter()`: dplyr#> • `lag()`: dplyr and stats

[]で囲まれた関数は組み込みルールのひとつにより選択されます。dplyr::filter()の選択は上記の優先する関数指定によるものです。集合演算(dplyr::intersect(x, y)dplyr::union(x, y)等)の選択は上位集合原則(訳注:定義は更新履歴参照)とbaseパッケージ同等のAPI拡張に従ったものです。

動作原理

conflictedパッケージを読み込むと"conflicted"環境が作成されて、グローバル環境の直後にアタッチされます。conflicted環境は複数パッケージの公開する任意のオブジェクトに対してアクティブな結合を含みます。アクティブな結合は名前の曖昧さを解決する方法を記述したエラーメッセージを送出します。また、conflicted環境はlibrary()require()への結合も含みます。この結合は衝突の報告を一時的に抑制して、conflicted環境を任意の新しい衝突を含むように更新します。

代替手段

conflictedパッケージとmodulesimportの比較は有意義です。どちらのパッケージもlibrary()の厳密な代替手段を提供して、検索パスに追加された関数のとても良い制御を提供します。

# modulesはすべてのパッケージ関数に名前空間の指定を期待します。
dplyr <- modules::import_package('dplyr')
dplyr$filter(mtcars, cyl ==8)# importsは関数の明示的な指定を期待します。
import::from(dplyr, select, arrange, dplyr_filter = filter)dplyr_filter(mtcars, cyl ==8)

これらはconflictedよりも前衛的な作業を要求しており、精密さと制御をもたらします。

conflictedはbase Rで作成された検索パス衝突の管理を改善するツールです。詳細はLuke Tierneyのこの投稿を参照してください。base Rとの主要な違いは、base Rはパッケージの読み込み時にすべての関数の衝突解決を要求することに対して、conflictedは衝突した関数の使用時に問題をレポートするだけであることです。

行動規範

conflictedプロジェクトはContributor Code of Conductに従って公開されています。プロジェクトに寄与する場合、上記のタームへの準拠に同意してください。

関数リファレンス

永続的に優先する関数の指定

conflict_prefer()は衝突の「勝者」を宣言できます。特定の組(dplyr::filter()base::filter()に勝つ)でも絶対勝者(dplyr::filter()が全ての挑戦者に勝つ)でも宣言できます。バージョン1.2.0からは速度と使いやすさにおいてconflicts_prefer()を使うべき場合が多いでしょう。

パッケージ中の全ての関数を優先する場合はconflicted_prefer_all()正規表現に一致する関数を優先する場合はconflicted_prefer_matching()を使います。

使い方

conflict_prefer(name, winner, losers =NULL, quiet =FALSE)conflict_prefer_matching(pattern, winner, losers =NULL, quiet =FALSE)conflict_prefer_all(winner, losers =NULL, quiet =FALSE)

引数

  • name

    関数の名前。

  • winner

    衝突に勝利すべきパッケージの名前。

  • losers

    省略可能。衝突に負けるべきパッケージのベクトル。省略時、winnerは全てのパッケージに勝利します。

  • quiet

    TRUEの場合、全ての出力は抑制されます。

  • pattern

    ‘winner‘パッケージ中の関数選択に使用する正規表現

具体例

# 他のパッケージよりも優先する。conflict_prefer("filter","dplyr")#> [conflicted] Will prefer dplyr::filter over any other package.# 特定のパッケージまたはパッケージ群よりも優先する。conflict_prefer("filter","dplyr","base")#> [conflicted] Removing existing preference.#> [conflicted] Will prefer dplyr::filter over base::filter.conflict_prefer("filter","dplyr",c("base","filtration"))#> [conflicted] Removing existing preference.#> [conflicted] Will prefer dplyr::filter over base::filter and#> filtration::filter.# パターンに一致する複数の関数を優先する。if(FALSE){# vroomのcol_*を優先する。conflict_prefer_matching("^col_","vroom")}# またはあるパッケージの全ての関数を優先する。if(FALSE){# 全てのtidylog関数をdtplyr関数よりも優先する。conflict_prefer_all("tidylog","dtplyr")}

パッケージ集合から衝突の検索

conflict_scout()はconflictedパッケージの働き者です。直接呼び出すことで実際に遭遇する前に全ての衝突を確認できます。

使い方

conflict_scout(pkgs =NULL)

引数

  • pkgs

    衝突を報告するパッケージ集合。NULLを指定した場合、全ての読み込み済みパッケージの衝突を報告します。既定値はNULLです。

戻り値

文字列ベクトルの名前付きリスト。名前は関数、値は衝突の生じたパッケージです。単一のパッケージがリストされた場合、自動的な曖昧さ解決の選択を意味します。

ユーザーフレンドリなprintメソッドは結果を箇条書きで出力します。

具体例

conflict_scout()#> 0 conflicts

優先する関数のまとめ指定

conflicts_prefer()は衝突の「勝者」をまとめて指定できます。

詳細な制御はconflict_prefer()を参照してください。

使い方

conflicts_prefer(..., .quiet =FALSE)

引数

  • ...

    pkg::funpkg::fun()形式の優先する関数。

  • .quiet

    TRUEの場合、全ての出力は抑制されます。

ベストプラクティス

スクリプトの先頭で必要な全パッケージのlibrary()を呼び出し、直後にconflicts_prefer()でまとめて指定を推奨します。

具体例

conflicts_prefer(
  dplyr::filter(),
  dplyr::lag(),)#> [conflicted] Removing existing preference.#> [conflicted] Will prefer dplyr::filter over any other package.#> [conflicted] Will prefer dplyr::lag over any other package.# またはconflicts_prefer(
  dplyr::filter,
  dplyr::lag,)#> [conflicted] Removing existing preference.#> [conflicted] Will prefer dplyr::filter over any other package.#> [conflicted] Removing existing preference.#> [conflicted] Will prefer dplyr::lag over any other package.

変更履歴

conflicted 1.2.0

CRAN公開日:2023-02-01

  • 新しいconflicts_prefer()は複数の推奨を一度に指定できます(#82)。例:conflicts_prefer(dplyr::filter, lubridate::week, ...)

  • 曖昧さ回避メッセージがクリック可能になりました(#74)。

  • 衝突はlibrary()include.onlyexclude引数を考慮します(#84)。

  • conflict_prefer_all()conflict_prefer_matching()は高速化しました。losersが与えられた場合、必要最小限の衝突のみ登録します。

conflicted 1.1.0

CRAN公開日:2021-11-26

  • 新しいconflicted_prefer_all()conflicted_prefer_matching()はどちらもおすすめです(#51)。

  • 衝突の検出と解決の改善:

    • 遅延読み込みデータセットによる衝突を報告します(#54)。

    • standardGenericによる衝突は報告しません(#47)。

    • 上位集合原則により、良く制御された衝突は消去されました。衝突がある場合、(任意のbase関数を含む)全ての関数を報告します。衝突が無い場合、(1と報告する替わりに)どのパッケージも報告しません(#47)。

    • 関数と非関数の衝突は報告しません(#30)。

    • プリミティブ関数による衝突はエラーになりません(@nerskin#46#48)。

conflicted 1.0.4

CRAN公開日:2019-06-21

  • dev rlang対応の修正

conflicted 1.0.3

CRAN公開日:2019-05-01

  • Fix > vs >= mistake

conflicted 1.0.2

CRAN公開日:2019-03-29

  • R 3.6との整合。

conflicted 1.0.1

CRAN公開日:2018-10-02

  • has_moved()内部関数が引数の無い.Deprecated()呼び出しで失敗しなくなりました(#29)。

  • .conflicts環境は新しいパッケージが読み込まれる度に正確に削除して置き換えられます(#28)。

conflicted 1.0.0

CRAN公開日:2018-09-15

新しい関数

  • conflict_scout()はパッケージ集合で見つけたすべての衝突を報告します。

  • conflict_prefer()はある関数を別の関数よりもセッション中で永続的に優先指定できます(#4)。

衝突解決の改善

  • 衝突は「上位集合原則」に従ってbaseパッケージ関数を上書きするパッケージを予期します。上位集合原則はfoo::bar(...)が非エラーの入力でbase::bar(...)と同じ値を返すことです。言い換えれば、base関数を上書きしてAPIを拡張できますが変更や削減はできません。

    ただし例外が2つあります。関数の引数に互換性がない場合(パッケージ中の関数がbase関数のすべての引数を含まない場合)、衝突は上位集合原則に従いません。また、dplyr::lag()は上位集合原則に従わず、特殊例としてマークされています(#2)。

  • パッケージ間で移動された関数(即ち、関数本体の最初の要素として.Deprecated("pkg::foo")を呼び出す関数)は衝突を生じません。

  • detach()イベントに対応しました。パッケージのデタッチにより削除された衝突を削除します(#5)。

軽微な改善とバグ修正

  • 中置関数と非統語的関数名の名前に対するエラーメッセージを改善しました(#14)。

Viewing all articles
Browse latest Browse all 8415

Trending Articles