【问题标题】:Check if package installation is required while running code via source()?通过 source() 运行代码时检查是否需要安装包?
【发布时间】:2021-11-29 10:29:24
【问题描述】:

我正在 RStudio 中运行多个脚本并检查语法错误。我在循环中使用 source() 来执行这些任务。在某些脚本中,会出现 install.packages("packagename")。我的问题是,当我的计算机中已经安装了所需的软件包时,会弹出一条消息,要求我更新库。在这些情况下,我希望能够“忽略”install.packages("packagename") 调用并运行代码以继续而不显示任何消息。

那么,如何在通过 source() 运行代码时检查是否需要安装包?

【问题讨论】:

  • 也许 require()does 你在找什么?
  • 谢谢,但我认为这还不够。如果我编辑每个脚本,我可以按照你的建议添加 require() 并且它可以工作。但我正在通过 source() 运行代码。我正在寻找不需要我编辑每个脚本的解决方案。
  • 在您的每个脚本中,您是否为每个包调用了install.packages("")?
  • 没有@VitaminB16。有 16 种不同的脚本。在某些脚本中,直接使用 library("") 调用一个或多个包,但在其他情况下,首先调用 install.packages("")。
  • @maluicr,您应该编辑这些脚本。如果他们不必要地调用install.packages,它们就会损坏,您应该修复它们。

标签: r install.packages


【解决方案1】:

有点破解,但是给定位置file,这将列出脚本中的所有包:

require(readr)
require(stringr)
listPackages <- function(file)
{
  r <- readr::read_file(file)
  r = str_replace_all(r, '\\"', "") # remove all quote marks
  packages <- str_extract_all(r, regex("(install.packages|library|require|p_load)\\([:alnum:]*\\)*", multiline = TRUE))[[1]]
  return(unique(gsub("\\(", "", str_extract(packages, regex("\\([:alnum:]*", multiline = F)))))
}

示例

test.R:

library("ggplot2")
library(stats)
require("cowplot")
require(MASS)

add <- function(x,y) {x+y}

install.packages("cowplot")
p_load(dplyr)
p_load("dplyr")
listPackages("test.R")
# [1] "ggplot2" "stats"   "cowplot" "MASS"    "cowplot" "dplyr" 

【讨论】:

  • 谢谢,效果很好,但仍然不能解决我的问题。可能我必须重写它。不管怎么说,还是要谢谢你。在你的代码中,我相信'stringr'包也是必需的。
  • 我建议您编辑所有脚本以使用pacman::p_load(X) 加载库X。如果未安装X,则相当于install.packages("X"); library(X)。如果安装了X,则相当于library(X)。
  • 然后你也可以做例如p_load("ggplot2","stats","cowplot") 一次加载/安装多个包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2012-08-23
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多