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

时间:2014-08-08 18:56:57

标签: r

例如,在R会话中,键入library(ggplot2)library("ggplot2")都可以导入库ggplot2。但是,如果我在交互式会话中键入ggplot2,我得到了:

> ggplot2
Error: object 'ggplot2' not found

因此,显然ggplot2不是一个对象。 library()如何接受未定义的变量而不抱怨它?

2 个答案:

答案 0 :(得分: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())) 

关键线是

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

这意味着只要您不将库的character.only参数更改为TRUE,R就会将您的包名转换为字符串并搜索它。

我们来测试一下:

 > library(ggplot2,character.only=TRUE)

输出:

 Error in library(ggplot2, character.only = TRUE) :
   object 'ggplot2' not found

library("ggplot2",character.only=TRUE)

加载包。

基本上,无论您将library()函数作为package的参数,它都会将其转换为字符,除非指定character.only为{{ 1}}。

正如Dason在评论中指出的那样,如果您将库名称存储为对象本身,则可以很好地使用TRUE参数。

答案 1 :(得分:4)

这是(来自library()的来源,......长......):

package <- as.character(substitute(package))

一种自己测试的简单方法:

foo <- function(x) as.character(substitute(x))
> foo(a)
[1] "a"
> foo("b")
[1] "b"