检索脚本中所需的库/包列表以获得可重现性

时间:2015-03-20 15:06:18

标签: r packages libraries reproducible-research

这是代码再现性方便的问题。您可能会在不同时间(例如,在降价文档的各个部分中)调用各种自定义库,从而结束或接收长代码。假设您的文档构造不良:

library(ggplot2)
# lots of lines of code
# and then more packages invoked, using both commands just spice things up
require(igraph) 
# lots of lines of code
library(pracma)
# lots of lines of code
# etc

是否有可能从代码中检索所有这些实例的函数,并将它们存储为例如列表?

然后,您可以更新脚本以包含注释行,以用作在不同工作区中工作的任何人的参考。

# To run this script first check if all libraries are installed and up to date.
# install.packages([results_of_an earlier_check])

当然可以从脚本中找到所有的库函数,但是自动化这个函数会更好,无论是构建自己的脚本还是更新不好的其他脚本。

1 个答案:

答案 0 :(得分:1)

这是一种方法,使用我共同撰写的两个软件包( qdapRegex 来抓取library次调用& pacman ,以便让其他人更轻松地编写脚本运行):

首先,我将使用您的示例制作一个假的.Rmd文件,以便它更像您真正拥有的

temp <- paste(readLines(n=8), collapse="\n")
library(ggplot2)
# lots of lines of code
# and then more packages invoked, using both commands just spice things up
require(igraph) 
# lots of lines of code
library(pracma)
# lots of lines of code
# etc

cat(temp, file="delete_me.rmd")

现在我们可以阅读并使用 qdapRegex 来抓取libraryrequire来电。然后我们使用 pacman 使脚本完全可重现:

rmd <- readLines("delete_me.rmd")

library(qdapRegex)
packs <- rm_between(rmd, c("library(", "require("), c(")", ")"), extract=TRUE)

boot <- 'if (!require("pacman")) install.packages("pacman")'
cat(paste0(boot, "\npacman::p_load(", paste(na.omit(unlist(packs)), collapse=", "), ")\n"))

这会产生:

if (!require("pacman")) install.packages("pacman")
pacman::p_load(ggplot2, igraph, pracma)

您可以将其粘贴到代码标记中的脚本顶部,或使用哈希使脚本可重现。如果要确保加载包的最新版本,请使用:p_install_version,以确保安装最小版本。