删除 R 中未使用的库

问题描述 投票:0回答:2

所以我刚刚写完了我的第一个脚本,从文本文件中组装威布尔分析。在我所有的修修补补中,我怀疑我可能加载了一些最终脚本中未使用的库。有没有一种快速的方法来检查脚本正在使用哪些库而不检查每个函数?

r code-cleanup
2个回答
1
投票

如果您通过

library
require
附加库,则最容易搜索您的代码。如果您调用库而不通过
<library>::<export>
语法附加它们,则搜索
::
。如果您担心传递依赖性或者只是想创建一个可重现的环境,请查看 packrat 包:http://rstudio.github.io/packrat/


0
投票

这不是特别漂亮或高效,但它应该可以完成工作(在大多数情况下):

library("stringr")

script_path = "/path/to/your/script.R"
load_command_pattern <- "library\\(\"[a-z,0-9]+\"\\)"

text <- readChar(script_path, file.info(script_path)$size)
pck <- str_extract_all(text, pattern = load_command_pattern)

# Find all instances where packages are loaded
packages <- list()
for(i in 1:length(pck[[1]])){
  p = pck[[1]][i]
  name <- str_extract(gsub("library", "", p), "[a-z,0-9]+")
  packages <- append(packages, name, after = length(packages))
}

# Load packages
for(i in 1:length(packages)){
  p <- packages[[i]]
  library(packages[[i]], character.only = TRUE)
}

# Make a list to store packages from which no function is called
remove <- list()
for(i in 1:length(packages)){
  p <- packages[[i]]
  # list all functions contained in the package
  funs <- ls(paste0("package:", p))
  # add an opening bracket to make sure to only find functions, not comments etc.
  functions <- paste0(funs, "\\(")
  # for every function in the package, check whether its name appears in the script
  in_script <- mapply(grepl, functions, text)
  # if none of the functions are contained in the script, add the package to the list
  if(!any(in_script)){
    remove <- append(remove, p)
  }
}

# Remove loading commands for all packages
for(i in 1:length(remove)){
  to_remove <- paste0("library\\(\"",remove[[i]] , "\"\\)")
  text = gsub(to_remove, "", text)
}

# Save output (to a new file! Don't overwrite your existing script without testing!)
sink(file = "/path/to/your/new_script.R")
cat(gsub("\\r", "", text))
sink()

请注意,我假设您使用

library("package_name")
加载包。您可能需要调整正则表达式模式。

代码应该做什么:

  1. 在文本中阅读您的 R 脚本
  2. 查找您加载包的所有实例。在这个例子中,我专门搜索呼叫
    library(...)
    。在这里,我们提取包名,假设它只包含字符和数字。
  3. 加载包,并列出它们包含的功能。如果在脚本中找不到任何函数,请将包名称附加到要删除的包列表中。
  4. 替换所有加载不必要包的实例。 (您也可以删除换行符。)
  5. 将脚本文本写入新文件。检查输出是否符合预期并测试新脚本。

请注意,这并不完美(例如,具有相似名称的函数可能会出现在多个包中。而且,目前还没有区分完整函数名称匹配和函数名称结尾匹配(搜索

my_function(
会给出误报
another_my_function(
。您可以添加额外的检查以查看是否有符号、换行符或空格引导函数名称。但是,我认为代码应该适用于大多数情况。

当然,如果您在脚本的开头加载所有包,您可以例如手动创建加载包列表。同样,您可以打印出未使用包的列表并手动删除它们。

© www.soinside.com 2019 - 2024. All rights reserved.