例如,在R会话中,键入library(ggplot2)
和library("ggplot2")
都可以导入库ggplot2。但是,如果我在交互式会话中键入ggplot2,我得到了:
> ggplot2
Error: object 'ggplot2' not found
因此,显然ggplot2不是一个对象。 library()如何接受未定义的变量而不抱怨它?
答案 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"