web-dev-qa-db-ja.com

dplyr :: select関数がMASS :: selectと衝突する

MASSパッケージをロードした場合:

library(MASS)

ロードしてからdplyr::select、エラーが表示されます。

library(dplyr)
mtcars %.%
select(mpg)

# Error in select(`__prev`, mpg) : unused argument (mpg)

どうすれば_dplyr::selectMASSパッケージがロードされていますか?

59
luciano

パスカルが言ったように、次の作品

require(MASS)
require(dplyr)
mtcars %>%
   dplyr::select(mpg)
63
r.bot

これは私が認めるよりも頻繁に起こります。 dplyrは、特にライブラリを介してこれらのライブラリの1つをロードするパッケージをロードする場合(そうすべきではありませんが、まだ実行するものもあります)、またはMASS::selectでdplyrをロードする場合(しないでください)で、特にplyr::summarisestats::filter、および.Rprofileと衝突しますそして、それはかなり曖昧な問題につながる可能性があり、常にエラーメッセージではなく、特にplyrと競合します。

私は最近conflicts()関数について学びました。便利ですが、2つのパッケージに同じ機能がある場合、「オーバーレポート」が競合します。 tidyr :: %>%およびdplyr :: %>%

そこで、私は 関数 と書いて、気が狂っているかどうか、または実際に現在のバグを引き起こしている競合があるかどうかを教えてくれました。競合をチェックするだけでなく、特定の目的のパッケージが「トップ」にあるかどうか、および関数の本体が実際に異なるかどうかもチェックします。

デフォルトではdplyrに対してこれを行いますが、want_packageパラメーターを使用して別のパッケージを指定できます。たとえば、多くのパッケージで再利用されるrecodealphaにつまずくことがよくあります。

使用法は単純です:amigoingmad()

デフォルトでは、次のコマンドを使用して、dplyrが「上」にない場合にも自動的に「修正」されます。

detach("package:dplyr", character.only = TRUE)
library("dplyr", character.only = TRUE)

この関数は、ユーザー指定の関数がdplyrをブロックしている場合に報告しますが、安全のためにこれを自動的に修正しません(その場合は関数を削除するだけです)。

まだ、このソリューションは私に問題を引き起こしていません。もちろん、本番コードでこれを使用することは推奨しませんが、.Rmd-ファイルをデバッグしていて、誤ってロード順序を台無しにした可能性がある場合は、簡単に見つける方法です。

パッケージでこれが必要な場合:

devtools::install_github("rubenarslan/formr")
19
Ruben

firstMASSライブラリーとseconddplyr oneをロードする場合

_library (MASS)
library (dplyr)
_

セッションのselect関数の最初のバージョンsearchpaths ()dplyrライブラリーのバージョンになります。

したがって

_select(mtcars, mpg)
_

として動作します

_dplyr::select(mtcars, mpg)
_
8
dmontaner

上記のKFBのコメントと同様に、私が見つけた簡単な解決策の1つは、(1)パッケージをロードする、(2)順序を気にしない(依存関係がある場合は難しい)、(3)どのパッケージにも優先順位を割り当てることですd名前空間を「所有」することを好む:

select <- dplyr::select
filter <- dplyr::filter

たとえば、environment: namespace以下の変更:

library(MASS)
select

  function (obj) 
  UseMethod("select")
  <bytecode: 0x7fbe822811b8>
  <environment: namespace:MASS>

select <- dplyr::select
select

  function (.data, ...) 
  {
      UseMethod("select")
  }
  <bytecode: 0x7fbe7c4a2f08>
  <environment: namespace:dplyr>
4
Omar Wasow

エレガントなソリューションは、次のようなconflictedパッケージを使用することです。

  • 名前空間の競合が発生した場合に、有益なエラーメッセージを生成します
  • 名前空間の優先順位を割り当てる明示的な関数を提供します

https://github.com/r-lib/conflicted の一部のコード例を参照してください

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

library(conflicted)
library(dplyr)

# example of informative error message
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 `conflicted_prefer()`
#> * conflict_prefer("filter", "dplyr")
#> * conflict_prefer("filter", "stats")

# example of assigning priority with conflict_prefer function
conflict_prefer("filter", "dplyr")

filter(mtcars, cyl == 8) %>% head(2)
#    mpg cyl  disp  hp drat   wt  qsec vs am gear carb
# 1 18.7   8 360.0 175 3.15 3.44 17.02  0  0    3    2
# 2 14.3   8 360.0 245 3.21 3.57 15.84  0  0    3    4
1
Omar Wasow