【问题标题】:How can library() accept both quoted and unquoted stringslibrary() 如何接受带引号和不带引号的字符串
【发布时间】:2014-08-08 18:56:57
【问题描述】:

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

> ggplot2
Error: object 'ggplot2' not found

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

【问题讨论】:

  • 因为一个糟糕的设计决策。我知道你问的是如何而不是为什么。如果你想知道怎么做,请阅读本文的第一部分:adv-r.had.co.nz/Computing-on-the-language.html
  • 从技术上讲,当您调用 library(ggplot) 时,参数将是“名称”对象而不是未加引号的字符串。
  • @MrFlick 不完全正确 - 该参数是一个未计算的表达式,如果计算将是一个错误。 substitute(package) 是一个名字。
  • @hadley 我想我只是通过class(parse(text="library(ggplot2)")[[1]][[2]]) 去,所以也许将其称为评估名称会更好,但它仍然应该是一个名称。我想我想澄清一下“未引用的字符串”到底是什么。
  • @CarlWitthoft IMO 这是一个糟糕的决定,尤其是因为它不一致。有一堆函数取包名,你还记得没有查看手册的情况下哪些需要引号:requireunloadNamespaceinstall.packagespackageVersion 等?确实library 可能是最常用的,但我还是希望它保持一致。

标签: r


【解决方案1】:

好问题!

让我们打开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 指定为TRUE

正如 Dason 在 cmets 中指出的那样,character.only 参数的良好用途是在您将库名称存储为对象本身的情况下。

【讨论】:

  • character.only 的真正用处在于当您传入存储在对象中的字符串时。例如packagetoload &lt;- "ggplot2"; library(packagetoload, character.only = TRUE)
【解决方案2】:

这是怎么回事(来自library()的来源,这是....long):

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 2017-02-26
    • 2012-10-13
    • 2015-02-15
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多