我的R脚本已经发展了好几个月,有许多增加和减少。这很漫长,我想知道我在代码中实际使用了哪些包,所以我可以开始删除library()引用。有没有办法在我的R脚本中找到冗余依赖项?
我看到this question所以我试过了:
library(mvbutils)
library(MyPackage)
library(dplyr)
foodweb( funs=find.funs( asNamespace( 'EndoMineR')), where=
asNamespace( 'EndoMineR'), prune='filter')
但是这真的告诉我在哪里使用包中的函数,而我不一定记得我在哪个包中使用了哪些函数。
我尝试了packrat
,但这是在寻找项目,而我是一个脚本目录,我正在尝试构建一个包。
答案 0 :(得分:0)
要执行此操作,首先parse
您的文件,然后使用getAnywhere
检查每个终端令牌在其中定义的命名空间。将结果与搜索路径进行比较,您将得到答案。我编译了一个函数,它接受一个文件名作为参数,并返回文件中使用的包。 请注意,它只能找到执行该功能时加载的软件包,因此请务必加载所有"候选人"第一
findUsedPackages <- function(sourcefile) {
## get parse tree
parse_data <- getParseData(parse(sourcefile))
## extract terminal tokens
terminal_tokens <- parse_data[parse_data$terminal == TRUE, "text"]
## get loaded packages/namespaces
search_path <- search()
## helper function to find the package a token belongs to
findPackage <- function(token) {
## get info where the token is defined
token_info <- getAnywhere(token)
##return the package the comes first in the search path
token_info$where[which.min(match(token_info$where, search_path))]
}
packages <- lapply(unique(terminal_tokens), findPackage)
##remove elements that do not belong to a loaded namespace
packages <- packages[sapply(packages, length) > 0]
packages <- do.call(c, packages)
packages <- unique(packages)
##do not return base and .GlobalEnv
packages[-which(packages %in% c("package:base", ".GlobalEnv"))]
}