2017-07-11 3 views
2

私はたくさんのサブパーツを持つかなり大きな研究プロジェクトに取り組んできました。私は各サブパーツごとにRスクリプトを作成していますので、1つのスクリプトで失われることはありません。Rにあまりにも多くのライブラリをロードすることの欠点は何ですか?

私の質問は、このような大きなプロジェクトでのライブラリの読み込みに関するベストプラクティスですか?

ここで私は何ですか:各サブパートの先頭に特定のライブラリを呼び出すのではなく、プロジェクト全体に必要なすべてのライブラリを読み込む別のスクリプトを作成しました。各部分の始まり。

場合によっては、私は、例えばggplot2や他のいくつかのライブラリのような、必要のないプロジェクトのサブ部分を作業していることがあります。 Rに多くの図書館を載せることの欠点は、必ずしもその瞬間を使用していないということですか?

ここには、私のLoadPackages.Rスクリプトの小さなサンプルがあります。私はすべてのライブラリをロードし、各作業セッションの開始時に

# List of packages to install 
    list.of.packages <- c("sp", "rgeos", "ggplot2", "data.table", "rgdal", "dplyr", 
         "magrittr", "spatialEco", "geosphere", "readr") 

# Only install packages not installed yet 
    new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])] 
    if(length(new.packages)) install.packages(new.packages) 

# Load packages 
    library(sp) 
    library(rgeos) 
    library(ggplot2) 
    library(data.table) 
    library(dplyr) 
    library(magrittr) 
    library(readr) 
    library(spatialEco) 
    library(geosphere) 
    library(rgdal) 

# clean global env. 
    rm(new.packages, list.of.packages) 
    gc(reset = T) 

:このスクリプトは、他のユーザーと共有プロジェクトで使用されることを意味していることに注意してくださいので、私はそれが重要なすべてのライブラリが正しくインストールされていることを確認するために見つけます実行中:

source("./R scripts/LoadPackages.R") 
+6

一つの欠点は、パッケージが他のパッケージやベースRからの関数を隠すことができることです。特に、Hadleyは彼のパッケージでそれを行うこととの妥協をしていないことが知られています。 – Roland

+1

グローバル環境でオブジェクトを作成し、それを 'rm'するのではなく、関連するコードを'ローカル({...}) '式に入れることを検討するべきです。それがそこにあるのです。 –

+0

なぜ 'data.table'、' dplyr'、 'magrittr'&' readr'をロードしますか?私は 'data.table'だけで十分であることに驚くことはありません。 – Jaap

答えて

3

複数の短所があります。重症度の粗いために:

  1. それは難しいコードについて推論することができます。コードは複雑です。したがって、堅牢なコードは、できるだけ単純なです。これはソフトウェア工学の確立された事実であり、また常識でもあります。プログラムの特定のポイントで表示できるシンボルの数を制限することが重要です。つまり、状態Xに1000個のシンボルが表示されている場合、これは状態Xについてのことを証明するためにはXでやっている)、私は約1000のシンボルとその相互作用について推論する必要があります。これは明らかに不可能です。そして、そのバグがでクリープ。異なるパッケージ同じ名前を使用しますので、

  2. 関連して、多くのパッケージを取り付けるロードとは、名前の衝突につながります。これは問題ではなく、言語の仕組みの自然な結果です。さまざまな分野で良い識別子が適用されることがあります。残念ながら、Rは、異なるパッケージからの同一の識別子に対処することでかなり悪いです。状況が起こらないようにしてください。

  3. なぜパッケージXをもう一度使用する必要がありますか?私は保証あなたは、コードのどこにも使用されなくなったパッケージをプロジェクトのある時点でロードすることができます。

  4. パッケージの読み込みが遅いです。これだけで、必要なパッケージのみを読み込むことができます。私は使用しているすべてのパッケージについてはわかりませんが、一部のパッケージ(特にBioconductorの場合)には最大10秒かかることがあります。一般

私は不必要にロードパッケージの実践に対して強くお勧めします。同様の理由から、私は パッケージのファンでもありません。すべての整然としたパッケージを一度に読み込むためのインタラクティブな探査には便利かもしれませんが、メンテナンス性が低下し、他のプログラミングコミュニティにも慣れていません。

+1

Konradには、ここで役立つモジュールパッケージhttps://github.com/klmr/modules(CRANモジュールパッケージと混同しないでください)があります。あるいは、Rパッケージを作成することもできます。 –

+0

あなたの答えをお寄せいただきありがとうございます@ Konrad、非常に感謝し、私はあなたの点に同意します。私はあなたがなぜ「コードについて推論するのが難しくなる」と言っているのか理解できません。私のアプローチを採用した1つの理由は、すべての私の 'library(xxx)'コマンドを別のファイルに入れて、より明確で使いやすいスクリプトを作成することでした。 –

+0

@ rafa.pereiraあなたのコードを数学的な証明、またはすべての記号(変数、関数...)が変数を表す方程式系と考えてください。あなたの仕事は、方程式のこのシステムを解くこと、または証明を要約することです。より多くの変数があるほど、これはより困難になります。実際には、数があれば、それは完全に不可能になるでしょう。すべての 'library'呼び出しはシンボルを追加します。したがって、コード内の任意の時点で、可能な限りライブラリが少数しかありません。残念ながらRはこれを一般的に難しくしています(ライブラリは通常は*添付されているためです)。 –

関連する問題