加载与安装库的语法。

时间:2015-11-14 14:01:25

标签: r syntax

我已经成为活跃的R用户好几年了,而且总是让我感到困惑。安装软件包(例如dplyr)时,必须将软件包的名称指定为字符串,即

install.packages("dplyr")

而不是

install.packages(dplyr)

这对我来说很有意义,因为"dplyr"将作为包的名称而不是作为对象传递,dplyr在没有引号的情况下隐含。{/ p>

但是,当我们去加载库时,字符串和对象版本都会通过并加载包。以下两个都正确加载包:

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

我的工作区中没有名为dplyr的对象,我不明白为什么这两个base函数会有不同的语法。我也不明白为什么没有引号的版本不会评估该对象。例如

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

以上安装 mada,但加载 dplyr,即使dplyr是一个评估为{{1}的对象}}。请注意,我在Mac OS 10.10.4上的"mada" v.0.99.467中工作,如果这很重要的话。 是否有这样的原因,或者仅仅是函数的工作方式不同?

4 个答案:

答案 0 :(得分:12)

library函数将包name作为第一个参数。此name实际上是指作为包参数传递的名称,而不是与该名称关联的任何值。 library函数在内部将package参数转换为字符文字(除非character.only设置为TRUE)。

所以,

plyr <- "dplyr"
library(plyr)

将接受

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

成为

package <- "plyr"

install.packages将字符向量作为要安装的包的名称。

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

这会安装plyr

这是因为install.packages不会使用pkgs参数进行任何此类转换。因此install.packages会安装pkgs所指的内容。

答案 1 :(得分:7)

如果您查看?library的源代码,您会看到line 230 click here

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

用户提供的包名称被强制转换为字符,然后连接:

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

这是允许输入没有引号的库。 install.packages没有相同的功能。

答案 2 :(得分:7)

  

我不明白为什么这两个基本函数会有不同的语法。

很难推测特定语言设计决策的原因。许多着名的R程序员批评允许library调用不带引号的名称的决定是不合逻辑的,不一致的和不必要的,但我们就是这样。

除了可以(略微)更方便地不键入引号的论点之外,另一个可能的原因是与其他语言的相似性:例如,在Python中你import库通过指定它们的名称如下:{{1 },不是 import lib_name。这鼓励库编写者选择在该语言中有效标识符的库名称(在Python中,加载的库是您需要引用的对象)。这在R中不太相关,除了加载它之外,你很少引用它。

  

我也不明白为什么没有引号的版本不会评估该对象。

因为R允许non-standard evaluation。特别是,函数参数仅在引用它们时进行评估,而不是在之前进行评估:

import 'lib_name'
从未使用

f = function (arg) {} f(stop('this won’t raise an error!')) ,因此从未进行评估。

arg的情况下,也不评估参数。相反,它通过substitute(package)以未评估的形式使用。

答案 3 :(得分:4)

如果您要在示例中加载mada而不是dplyr,请尝试使用选项character.only = TRUE

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

有关详细信息,请参阅文档?library