加载和安装库的语法。
Syntax for loading vs. installing libraries.
几年来我一直是 R
的活跃用户,但总有一些事情让我感到困惑。安装包时(例如 dplyr
),必须将包的名称指定为字符串,即
install.packages("dplyr")
而不是
install.packages(dplyr)
这对我来说很有意义,因为 "dplyr"
将作为包的名称而不是作为对象传递,dplyr
不带引号就暗示了这一点。
但是,当我们去加载库时,字符串和对象版本都通过并加载包。以下两项均正确加载包:
library("dplyr")
detach("package:dplyr", unload=TRUE)
library(dplyr)
我的工作区中没有名为 dplyr
的对象,我不明白为什么这两个 base
函数会有不同的语法。我也不明白为什么没有引号 的版本不会 评估对象。例如
dplyr <- "mada"
install.packages(dplyr)
library(dplyr)
以上安装mada
,但加载dplyr
,即使dplyr
是计算结果为 "mada"
的对象。请注意,如果重要的话,我正在 Mac OS 10.10.4 上的 RStudio
v.0.99.467 中工作。
这是有原因的,还是仅仅是函数的工作方式不同?
如果您想在示例中加载 mada
而不是 dplyr
,请尝试使用选项 character.only = TRUE
dplyr <- "mada"
install.packages(dplyr)
library(dplyr, character.only=TRUE)
有关详细信息,请参阅文档 ?library
。
如果您查看 ?library
的源代码,您将在 line 230 click here 处看到:
if (!character.only)
package <- as.character(substitute(package))
用户提供的包名称被强制转换为字符然后连接:
pkgname <- paste("package", package, sep = ":")
这是允许输入不带引号的库。 install.packages
没有相同的功能。
library
函数将包 name
作为第一个参数。这个 name
实际上是指作为包参数传递的名称,而不是与该名称关联的任何值。 library
函数在内部将包参数转换为字符文字(当 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
指的是什么。
I don't understand why these two base functions would have different syntax.
很难推测特定语言设计决策的原因。 library
调用允许不加引号的名称的决定被许多著名的 R 程序员批评为不合逻辑、不一致和不必要的,但我们就是这样。
除了不输入引号(稍微)更方便的说法外,另一个潜在的原因是与其他语言的相似性:例如,在 Python 中,您 import
库通过指定它们的名称像这样:import lib_name
,不是 import 'lib_name'
。这鼓励库编写者选择在语言中作为有效标识符的库名称(在 Python 中,加载的库是您需要引用的对象)。这在 R 中不太相关,在 R 中,除了加载它之外你很少引用库。
I also don't understand why the version without the quotation marks wouldn't evaluate the object.
因为 R 允许 non-standard evaluation。特别是,函数参数仅在被引用时才被评估,而不是之前:
f = function (arg) {}
f(stop('this won’t raise an error!'))
arg
从未使用过,因此从未评估过。
在 library
的情况下,参数也不计算。相反,它通过 substitute(package)
.
以未评估的形式使用
几年来我一直是 R
的活跃用户,但总有一些事情让我感到困惑。安装包时(例如 dplyr
),必须将包的名称指定为字符串,即
install.packages("dplyr")
而不是
install.packages(dplyr)
这对我来说很有意义,因为 "dplyr"
将作为包的名称而不是作为对象传递,dplyr
不带引号就暗示了这一点。
但是,当我们去加载库时,字符串和对象版本都通过并加载包。以下两项均正确加载包:
library("dplyr")
detach("package:dplyr", unload=TRUE)
library(dplyr)
我的工作区中没有名为 dplyr
的对象,我不明白为什么这两个 base
函数会有不同的语法。我也不明白为什么没有引号 的版本不会 评估对象。例如
dplyr <- "mada"
install.packages(dplyr)
library(dplyr)
以上安装mada
,但加载dplyr
,即使dplyr
是计算结果为 "mada"
的对象。请注意,如果重要的话,我正在 Mac OS 10.10.4 上的 RStudio
v.0.99.467 中工作。
这是有原因的,还是仅仅是函数的工作方式不同?
如果您想在示例中加载 mada
而不是 dplyr
,请尝试使用选项 character.only = TRUE
dplyr <- "mada"
install.packages(dplyr)
library(dplyr, character.only=TRUE)
有关详细信息,请参阅文档 ?library
。
如果您查看 ?library
的源代码,您将在 line 230 click here 处看到:
if (!character.only)
package <- as.character(substitute(package))
用户提供的包名称被强制转换为字符然后连接:
pkgname <- paste("package", package, sep = ":")
这是允许输入不带引号的库。 install.packages
没有相同的功能。
library
函数将包 name
作为第一个参数。这个 name
实际上是指作为包参数传递的名称,而不是与该名称关联的任何值。 library
函数在内部将包参数转换为字符文字(当 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
指的是什么。
I don't understand why these two base functions would have different syntax.
很难推测特定语言设计决策的原因。 library
调用允许不加引号的名称的决定被许多著名的 R 程序员批评为不合逻辑、不一致和不必要的,但我们就是这样。
除了不输入引号(稍微)更方便的说法外,另一个潜在的原因是与其他语言的相似性:例如,在 Python 中,您 import
库通过指定它们的名称像这样:import lib_name
,不是 import 'lib_name'
。这鼓励库编写者选择在语言中作为有效标识符的库名称(在 Python 中,加载的库是您需要引用的对象)。这在 R 中不太相关,在 R 中,除了加载它之外你很少引用库。
I also don't understand why the version without the quotation marks wouldn't evaluate the object.
因为 R 允许 non-standard evaluation。特别是,函数参数仅在被引用时才被评估,而不是之前:
f = function (arg) {}
f(stop('this won’t raise an error!'))
arg
从未使用过,因此从未评估过。
在 library
的情况下,参数也不计算。相反,它通过 substitute(package)
.