【问题标题】:Require packages that are not installed when knitting in R markdown需要在 R markdown 中编织时未安装的包
【发布时间】:2021-02-06 21:55:37
【问题描述】:

所以,我想将许多 .Rmd 文件编织成 pdf 格式。我写了以下代码:

files <- list.files(pattern = "[.]Rmd$")
for (f in files) rmarkdown::render(f, output_format = "pdf_document")

但是,该过程会不断停止,因为我没有安装许多软件包,然后我必须手动安装它们。出现以下消息,例如:

Quitting from lines 33-35 (02-PreProcessing.Rmd) 
Error in library(earth): there is no package called 'earth'

我应该在代码中添加什么以便自动下载包而我不必手动下载? 谢谢

【问题讨论】:

  • 试试install.packages('earth')如果你想自动检查和下载然后使用require(earth)而不是library(earth)
  • 好吧,那就是手动下载。还有其他的包会在后面出现,我想自动下载所有这些。不知道需要安装什么包
  • 如果你使用像Rstudio这样的IDE,它会在发现library没有安装时自动建议安装这些包
  • 我用的是 Rstudion 但不建议安装打包。正如我已经写的那样,它会引发错误
  • 我不确定您拥有的 Rstudio 版本,但根据我的经验,如果缺少某些软件包,它会建议并安装软件包

标签: r r-markdown


【解决方案1】:

在我看来,最好的方法是阅读文件和正则表达式库/require/p_load 用法。

虽然没有经过测试,但可能需要进行如此小的调整:

library(magrittr)

files <- list.files(pattern = "[.]Rmd$")

installed_paks <- installed.packages()[, 1]

for (f in files) {
tt <- readLines(f)
# some regex 
rr = "(?:library|require|p_load)\\(\"?\'?([a-zA-Z0-9_\\.]*)\'?\"?\\)"
ll = stringr::str_match_all(tt, rr) %>% do.call(rbind, .))

if (nrow(ll) >0) {
for(pak in ll[ ,2]){
if(! pak %in% installed_paks) install.packages(pak)
}
}
rmarkdown::render(f, output_format = "pdf_document")
}

原始库正则表达式:

> (stringr::str_match_all(c("dd", "ddd", "library(miceFast)", "library(aa);library('dd')"), "(?:library|require|p_load)\\(\"?\'?([a-zA-Z0-9_\\.]*)\'?\"?\\)") %>% do.call(rbind, .))[, 2]
[1] "miceFast" "aa"       "dd"

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多