【问题标题】:How can I install packages in knitr?如何在 knitr 中安装软件包?
【发布时间】:2015-06-05 19:26:01
【问题描述】:

到目前为止,我一直在使用这段代码来加载 R 包并编写 .R 文件。但我正在尝试使用 knitr

rm (list=ls(all=TRUE))
kpacks <- c('ggplot2','install_github','devtools','mapdata')
new.packs <- kpacks[!(kpacks %in% installed.packages()[,"Package"])]
if(length(new.packs)) install.packages(new.packs)
lapply(kpacks, require, character.only=T)
remove(kpacks, new.packs)
options(max.print=5.5E5)

但是现在,当我将这段代码放入 Knitr 文档时,我得到了这个错误:

Error in contrib.url(repos, "source") :
  trying to use CRAN without setting a mirror calls:......

我该如何解决这个问题?

【问题讨论】:

    标签: r markdown knitr


    【解决方案1】:

    您的问题的狭义答案是您应该设置repos 选项:

    options(repos=c(CRAN="<something sensible near you>"))
    

    您遇到了问题,因为当最初未设置存储库选项时,R 的默认行为是查询用户——而当您以非交互方式运行代码时,它不能这样做。

    更广泛地说,我会质疑你是否想在你的 R 代码中包含这种东西;在某些情况下,它可能会出现问题。

    • 如果用户没有网络连接怎么办?
    • 如果它们在地理位置上离您很远,以至于您的默认存储库设置没有意义怎么办?
    • 如果他们不想下载和安装(可能很大)包怎么办?

    我的首选做法是在运行代码的说明中指定用户应该安装包 X、Y、Z(并为他们提供安装它们的示例代码,以防他们不熟悉 R)。

    【讨论】:

    • 谢谢。说得通。我这样做是为了让用户不必费神去加载包。互联网不是问题。
    【解决方案2】:

    避免安装软件包的一种方法是执行类似的操作

    if(!require(package.name))
      stop("you need to install package.name")
    

    在您的代码块中。根据您的 knitr 文档设置,这将在文档中、控制台中生成消息,或阻止文档被编织。

    【讨论】:

    • 这已经在 OP 的代码中通过检查要安装的软件包列表来处理 installed.packages() ...
    • @Ben,这是真的,但我的建议更多的是与用户交流而不是安装软件包。使用一系列 if(!require()) 语句有助于解决您在询问是否有一个 knitr 文档尝试强制安装 R 软件包时列出的各个点,同时仍然保持对用户的简单性。
    猜你喜欢
    • 2012-07-22
    • 2016-07-09
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2022-10-01
    • 2017-03-30
    • 2015-04-11
    • 2017-12-30
    相关资源
    最近更新 更多