所以我刚刚写完了我的第一个脚本,从文本文件中组装威布尔分析。在我所有的修修补补中,我怀疑我可能加载了一些最终脚本中未使用的库。有没有一种快速的方法来检查脚本正在使用哪些库而不检查每个函数?
如果您通过
library
或 require
附加库,则最容易搜索您的代码。如果您调用库而不通过 <library>::<export>
语法附加它们,则搜索 ::
。如果您担心传递依赖性或者只是想创建一个可重现的环境,请查看 packrat 包:http://rstudio.github.io/packrat/
这不是特别漂亮或高效,但它应该可以完成工作(在大多数情况下):
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")
加载包。您可能需要调整正则表达式模式。
代码应该做什么:
library(...)
。在这里,我们提取包名,假设它只包含字符和数字。请注意,这并不完美(例如,具有相似名称的函数可能会出现在多个包中。而且,目前还没有区分完整函数名称匹配和函数名称结尾匹配(搜索
my_function(
会给出误报another_my_function(
。您可以添加额外的检查以查看是否有符号、换行符或空格引导函数名称。但是,我认为代码应该适用于大多数情况。
当然,如果您在脚本的开头加载所有包,您可以例如手动创建加载包列表。同样,您可以打印出未使用包的列表并手动删除它们。