R几年来我一直是一个活跃的用户,而且总是让我感到困惑.安装软件包(例如dplyr)时,必须将软件包的名称指定为字符串即ie
install.packages("dplyr")
Run Code Online (Sandbox Code Playgroud)
而不是
install.packages(dplyr)
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义,因为它"dplyr"会作为包的名称传递而不是作为对象传递,这将在dplyr没有引号的情况下隐含.
但是,当我们去加载库时,字符串和对象版本都会通过并加载包.以下两个都正确加载包:
library("dplyr")
detach("package:dplyr", unload=TRUE)
library(dplyr)
Run Code Online (Sandbox Code Playgroud)
dplyr在我的工作区中没有命名对象,我不明白为什么这两个base函数会有不同的语法.我也不明白为什么没有引号的版本不会评估该对象.例如
dplyr <- "mada"
install.packages(dplyr)
library(dplyr)
Run Code Online (Sandbox Code Playgroud)
上面的安装 mada,但加载 dplyr,即使dplyr是一个评估的对象"mada".请注意,我RStudio在Mac OS 10.10.4上的v.0.99.467中工作,如果这很重要的话.这有什么原因,还是只是功能有所不同?
nar*_*ary 12
libraryfunction将package name作为第一个参数.这name实际上是指作为包参数传递的名称,而不是与该名称关联的任何值.libraryfunction将package参数内部转换为字符文字(character.only设置为时除外TRUE).
所以,
plyr <- "dplyr"
library(plyr)
Run Code Online (Sandbox Code Playgroud)
会经历
if(!character.only)
package <- as.character(substitute(plyr))
Run Code Online (Sandbox Code Playgroud)
成为
package <- "plyr"
Run Code Online (Sandbox Code Playgroud)
install.packages 将字符向量作为要安装的包的名称.
dd <- "plyr"
install.packages(dd)
Run Code Online (Sandbox Code Playgroud)
这将安装plyr.
这是因为install.packages不要使用pkgs参数进行任何此类转换.所以install.packages安装pkgs指的是什么.
如果您查看源代码,?library您将在第230行看到,请单击此处:
if (!character.only)
package <- as.character(substitute(package))
Run Code Online (Sandbox Code Playgroud)
用户提供的包名称被强制转换为字符,然后连接:
pkgname <- paste("package", package, sep = ":")
Run Code Online (Sandbox Code Playgroud)
这是允许输入没有引号的库.install.packages没有相同的功能.
我不明白为什么这两个基本函数会有不同的语法.
特定语言设计决策的原因很难推测.允许不带引号的library呼叫名称的决定被许多着名的R程序员批评为不合逻辑,不一致和不必要,但我们在这里.
除此之外,它的(轻微)的说法更加方便不输入引号,另一个潜在的原因是相似的其他语言:例如,在Python import库通过指定他们的名字,像这样:import lib_name,不是 import 'lib_name'.这鼓励库编写者选择在该语言中有效标识符的库名称(在Python中,加载的库是您需要引用的对象).这与R不太相关,除了加载它之外,你很少参考库.
我也不明白为什么没有引号的版本不会评估该对象.
因为R允许非标准评估.特别是,函数参数仅在引用它们时进行评估,而不是在之前:
f = function (arg) {}
f(stop('this won’t raise an error!'))
Run Code Online (Sandbox Code Playgroud)
arg 永远不会被使用,所以从未评估过.
在这种情况下library,也不评估参数.相反,它通过未评估的形式使用substitute(package).