例如,在R会话中,键入library(ggplot2)并且library("ggplot2")都可以导入库ggplot2.但是,如果我在交互式会话中键入ggplot2,我得到:
> ggplot2
Error: object 'ggplot2' not found
Run Code Online (Sandbox Code Playgroud)
因此,显然ggplot2不是一个对象.library()如何接受未定义的变量而不抱怨它?
bjo*_*eph 14
好问题!
让我们破解library()功能,看看它是如何工作的.
进入library交互式会话以查看函数的内部.
该功能的关键部分来自第186至197行.
if (!missing(package)) {
if (is.null(lib.loc))
lib.loc <- .libPaths()
lib.loc <- lib.loc[file.info(lib.loc)$isdir %in% TRUE]
if (!character.only)
package <- as.character(substitute(package))
if (length(package) != 1L)
stop("'package' must be of length 1")
if (is.na(package) || (package == ""))
stop("invalid package name")
pkgname <- paste("package", package, sep = ":")
newpackage <- is.na(match(pkgname, search()))
Run Code Online (Sandbox Code Playgroud)
关键是
if (!character.only)
package <- as.character(substitute(package))
Run Code Online (Sandbox Code Playgroud)
这意味着只要您不更改character.only库的参数TRUE,R就会将您的包名转换为字符串并搜索它.
我们来测试一下:
> library(ggplot2,character.only=TRUE)
Run Code Online (Sandbox Code Playgroud)
输出:
Error in library(ggplot2, character.only = TRUE) :
object 'ggplot2' not found
Run Code Online (Sandbox Code Playgroud)
而
library("ggplot2",character.only=TRUE)
Run Code Online (Sandbox Code Playgroud)
加载包.
基本上,无论你将library()函数作为参数赋予package它,它都会将它转换为字符,除非你指定character.only TRUE.
正如Dason在评论中指出的那样,character.only如果您将库名称存储为对象本身,则可以充分利用该参数.
这是如何(从 的来源library(),这是....长):
package <- as.character(substitute(package))
Run Code Online (Sandbox Code Playgroud)
一种自己测试的简单方法:
foo <- function(x) as.character(substitute(x))
> foo(a)
[1] "a"
> foo("b")
[1] "b"
Run Code Online (Sandbox Code Playgroud)