web-dev-qa-db-ja.com

R dplyrフィルターがベースフィルターをマスキングしていませんか?

職場では、R3.1.2を実行しているWindows7コンピューターがあります。

Packages.Rというファイルがあります。このファイルには、次のコードがあります。

library(dplyr)
library(sqlutils)
library(RODBC)

私の.Rprofileには、.Firstという関数が含まれています。

.First <- function() {
    source("R/packages.R")
}

Rをロードすると、次の出力が得られます。

Loading required package: roxygen2
Loading required package: stringr
Loading required package: DBI

Attaching package: 'dplyr'

The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union

これを注意深く見ると、統計からのフィルターがマスクされていないことがわかります。

しかし、まったく同じ設定を行い、packages.Rのlibrary(dplyr)ステートメントをコメントアウトする場合は、ファイルを保存し、Rを再起動してから手動で再起動します。 。 。 。手で入力するように。 。 。 。

library(dplyr)

Attaching package: 'dplyr'

The following object is masked from 'package:stats':

    filter

The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union

これで、package :: statsがマスクされます。

わかりません。このプロジェクトでは、dplyrのfilterコマンドを頻繁に使用する必要があり、使用するためにdplyr :: filterと入力したくありません。誰かが私の弱い心がなぜこれがこのように振る舞うのか理解するのを手伝ってくれませんか? RStudioとESSでRを起動しようとしましたが、どちらでもまったく同じ動作が得られます。また、dplyrをpackages.Rファイルの最後に移動してみましたが、結果に違いはありませんでした。 stats :: filterをマスクしたいだけです。ありがとう。

12
Choens

ライブラリを_.RProfile_にロードすると、ライブラリはR起動プロセスの非常に早い段階で、statsパッケージがアタッチされる前にアタッチされます。逆に、statsがすでにロードされた後にdplyrをアタッチします。 _?Startup_と入力すると、Rの起動プロセスについて知ることができます。そこにそれは言う:

サイトとユーザープロファイルファイルがソースされている場合基本パッケージのみがロードされますであるため、他のパッケージ内のオブジェクトは、たとえば次のように参照する必要があることに注意してください。 utils :: dump.frames、または関連するパッケージを明示的にロードした後。

個人的にはあまり強い気持ちはありませんが、この理由、つまりパッケージの読み込み順序の不一致のために、ハドリーが_.RProfile_でパッケージを読み込むことを推奨していないのを見てきました。

考えられる解決策の1つは、dplyrをロードする前に、スクリプトの最初のライブラリ呼び出しとしてlibrary(stats)を追加することです。

この種の問題をよりグローバルに回避するためのもう1つの(長期的な)オプションは、ワークフローを「スクリプトの大規模なコレクション」から1つ以上のパッケージに移行することです。

13
joran

私はまったく同じ問題を抱えていました、そしてそれはとても迷惑です。私がしたように警告メッセージを抑制したい場合は:-)library(dplyr, warn.conflicts = FALSE)でロードできます。