library()如何接受引用和不引用的字符串

Yu *_* Fu 11 r

例如,在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如果您将库名称存储为对象本身,则可以充分利用该参数.

  • 当你传入一个存储在一个对象中的字符串时,`character.only`的真正用处.例如`packagetoload < - "ggplot2"; library(packagetoload,character.only = TRUE)` (2认同)

jor*_*ran 5

这是如何(从 的来源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)