2015-11-14 4 views
17

私は数年前からアクティブRのユーザーでしたが、何かが私を混乱させていました。 (例えばdplyr)パッケージをインストールする場合"dplyr"はの名前として渡すであろうから、一つは、ライブラリのロードとインストールの構文。

install.packages("dplyr") 

よりもむしろ

install.packages(dplyr) 

これは私には理にかなっている、すなわち、文字列としてパッケージの名前を指定する必要があります。パッケージであり、オブジェクトとしてではなく、dplyrによって暗黙指定されています。

しかし、ライブラリをロードすると、文字列とオブジェクトバージョンの両方がパススルーされ、パッケージがロードされます。そこ私のワークスペースにdplyrという名前のオブジェクトがありません、そしてこれら2つのbaseの機能が異なる構文を持つことになり、なぜ私は理解していない

library("dplyr") 
detach("package:dplyr", unload=TRUE) 
library(dplyr) 

:正しく次のどちらも、パッケージをロードします。引用符のないバージョンオブジェクトを評価しない理由もわかりません。例えば

dplyr <- "mada" 
install.packages(dplyr) 
library(dplyr) 

上記dplyr"mada"に評価対象であっても、madaをインストールしたが、負荷dplyr。 Mac OS 10.10.4でRStudio v.0.99.467で作業していることに注意してください。 これには理由がありますか、あるいは単に機能が異なって機能していますか?あなたはあなたの例ではmada代わりのdplyrをロードする場合

+5

これは基本的に歴史の事故です。 –

答えて

12

library関数は、第1引数としてパッケージnameをとります。このnameは実際には、その名前に関連付けられた値ではなく、package引数として渡される名前を参照します。 library関数は、内部的にパッケージ引数を文字リテラルに変換します(character.onlyTRUEに設定されている場合を除く)。

ので、

plyr <- "dplyr" 
library(plyr) 

package <- "plyr" 

install.packagesインストールするパッケージの名前(複数可)として文字ベクトルを取りになることを

if(!character.only) 
    package <- as.character(substitute(plyr)) 

を受けることになります。

dd <- "plyr" 
install.packages(dd) 

これはplyrをインストールします。

install.packagesは、pkgs引数でこのような変換を行わないためです。したがって、install.packagesは、pkgsが参照するものをインストールします。

4

、詳細についてのドキュメントを参照してください?libraryオプションcharacter.only = TRUE

dplyr <- "mada" 
install.packages(dplyr) 
library(dplyr, character.only=TRUE) 

を使用してみてください。あなたは?libraryのためのソースコードを見てみると

+0

+1ありがとう、これは非常に便利です。しかし、なぜこれが回避策ではなく発生するのかについての説明をもっと求めていました。デフォルトが 'character.only = F'になる理由についてコメントできますか?質問を少しだけ開いたままにしておきます。 –

7

あなたはline 230 click hereで表示されます。

if (!character.only) 
      package <- as.character(substitute(package)) 

ユーザーの供給が、その後の文字に強制変換連結されていることを、パッケージ名:

pkgname <- paste("package", package, sep = ":") 

これは何ですライブラリを引用符なしで入力できます。 install.packagesには同じ機能がありません。

+3

ありがとう、これは間違いなく正しい答えです。私はNarendraの答えを受け入れました。なぜなら、彼らは担当者を必要とする新しいユーザーであり、適切な説明で正しい回答を得ているように思えるからです。私はこれがあなたと大丈夫だと願っています。 –

+1

@ChrisC私は同意しません。最善の回答を受け入れて、別の回答を受け入れるべきではありません。なぜなら、他のユーザーにはごめんなさいと感じるからです。コミュニティにとっては、最良の答えが受け入れられるのが最善です。 – Jaap

+0

@Jaap入力をありがとう。その場合、私は両方の答えが同じだと思っていましたが、Narendraの方が理解しやすく、完全でしたので、私は同じ答えを受け入れます。 –

7

これらの2つの基本機能の構文が異なる理由はわかりません。

特定の言語設計の決定理由を推測するのは難しいです。 library呼び出しで引用されていない名前を許可するかどうかの決定は、多くの著名なRプログラマーによって非論理的、一貫性がなく不必要なものとして批判されてきましたが、ここではそうです。

それは引用符を入力しない(わずか)より便利だし、他の潜在的な理由は、他の言語との類似であるという議論に加えて:import lib_nameないimport 'lib_name':例えば、Pythonのあなたimportそのような彼らの名前を指定することにより、ライブラリに。これにより、ライブラリ作成者は言語の有効な識別子であるライブラリ名を選択することができます(Pythonでは、ロードされたライブラリは参照する必要のあるオブジェクトです)。これはRではあまり意味がありません。Rを読み込む以外にライブラリを参照することはめったにありません。

引用符なしのバージョンががオブジェクトを評価しないだろう、なぜ私も理解していません。

Rはnon-standard evaluationを許可するためです。特に、それらが呼ばれたときに関数の引数だけではないの前に、評価されます。

f = function (arg) {} 
f(stop('this won’t raise an error!')) 

arg使用したことがないので、評価されることはありません。

libraryの場合、引数も評価されません。代わりに、substitute(package)で未評価の形式で使用されています。

関連する問題