web-dev-qa-db-ja.com

インストール時のエラー:タイプ「closure」をタイプ「character」のベクターに強制できません

次のように入力して、すべてのガラガラ関連パッケージをインストールしようとしました。

install.packages(rattle, dependencies = c("Depends","Suggests"))

そしてこれを得た

Installing package into ‘C:/Users/Hooman/Documents/R/win-library/3.1’
(as ‘lib’ is unspecified)
Error in as.character(x) : 
  cannot coerce type 'closure' to vector of type 'character'

そのフォルダーに2つの個別のパッケージを既にインストールしていて、問題はありませんでした。

15
user7789

@BenBolkerは答えをコメントとして投稿しました。おそらく彼は、あなたがあなたのコードと彼の違いをじっと見つめ、禅の瞬間を手に入れることを望んでいるからでしょう。彼はまた、控えめな紳士であるため、賛成票を出すのは簡単すぎると考えています。だから、私はどんな賛成票も私のものではなく彼のものであるという罪を感じています。私は今、合法的にすべての賛成票を獲得しようとします。

エラーが発生した理由は、install.packages関数が文字オブジェクトを予期しているのに、引用符で囲まれていない式rattleを指定したためです。 Benは単一要素の文字ベクトル"rattle"を使用しているため、関数の要件に適合しています。いくつかの関数とは異なり、install.packagesはその最初の引数の「非標準評価」を提供する機能を備えていません。

Rは、時々矛盾した評価規則を持つ面白い言語です。引用符で囲まれていない式を指定して、自動的に文字に変換できる関数がいくつかあります。リストには、library、およびそのいとこ、require、およびhelpsubset、および$が含まれます。これらは、知識のあるユーザーによって「非標準」の評価と見なされ、プログラミングに落とし穴がある場合があります。エラーメッセージは、Rが言語オブジェクト、クロージャー(大まかに言うと、関数のRおよびLISP用語)である「思考」を文字に変換しようとしたが成功しなかったことを示しています。このコンソールの相互作用で同じエラーを見ることができます:

> as.character(mean)
Error in as.character(mean) : 
  cannot coerce type 'closure' to vector of type 'character'

Benが言及したlibrary関数を見て、内部関数定義をスクロールダウンすると、最終的にライブラリがそのエラーを回避するメカニズムに到達します。

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

これにより、エラーを回避することもできます。これは、例として意図的に使用したものです。

> as.character(substitute(mean))
[1] "mean"

substitute関数は、クロージャーと見なされる言語要素で処理を行っており、結果のオブジェクトRの「名前」にはas.characterメソッドがあります。

24
42-