安装时出错:无法强制将'闭包'强制类型为'character'类型的向量

use*_*789 15 installation r rattle

尝试键入以下命令安装所有与拨浪鼓相关的包:

install.packages(rattle, dependencies = c("Depends","Suggests"))
Run Code Online (Sandbox Code Playgroud)

得到了这个

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'
Run Code Online (Sandbox Code Playgroud)

我已经在该文件夹中安装了两个单独的包,没有任何问题.

42-*_*42- 25

@BenBolker作为评论发布了一个答案,也许是因为他希望你能盯着你的代码和他的代码之间的区别,并获得一个禅宗时刻.他也认为,作为一个谦虚的绅士,他太简单了,不值得任何赞成.所以我感到内疚,任何赞成是他的而不是我的.我现在将尝试合法地获得任何赞成票.

你得到错误的原因是install.packages函数需要一个字符对象,而你给它一个不带引号的表达式rattle.Ben使用单个元素字符向量"rattle",因此符合函数的要求.不像某些功能install.packages不能提供其第一个参数的"非标准评估".

R有时是一种有趣的语言,有一些不一致的评估惯例.有几个函数可以提供不带引号的表达式并自动转换为字符.这份名单包括library,和其表弟,require,以及help,subset$.这些被知识渊博的用户视为"非标准"评估,他们可能会在编程中遇到陷阱.错误消息告诉你R试图转换它"认为"将是一个语言对象,一个闭包(松散地是一个R和LiSP术语的函数),一个字符,并没有成功.您可以通过此控制台交互看到相同的错误:

> as.character(mean)
Error in as.character(mean) : 
  cannot coerce type 'closure' to vector of type 'character'
Run Code Online (Sandbox Code Playgroud)

如果您查看libraryBen提到的函数并向下滚动内部函数定义,您最终会得到库避免该错误的机制:

if (!character.only) 
            package <- as.character(substitute(package))
Run Code Online (Sandbox Code Playgroud)

这也可以避免错误,我故意用它作为例子:

> as.character(substitute(mean))
[1] "mean"
Run Code Online (Sandbox Code Playgroud)

substitute函数正在对作为闭包的语言元素进行处理,并且结果对象R"name"具有as.character方法.

  • 公平地说,它相当令人困惑(我认为)因为像`library()`和`require()`这样的函数试图通过允许它们指定字符向量或者a来使用户的生活变得更容易(我认为是错误的)符号 (9认同)