如何解决在包开发期间查找未使用/“孤立”的非导出对象
我正在重构一个包含许多非导出函数和其他非导出对象的包。除了手动对包中每个函数的名称进行全文搜索之外,有没有一种方法可以快速识别所有已定义但未导出或调用的“孤立”对象?
另外一个复杂因素是在 glue
f-style 字符串中调用了一些函数,因此可能会出现调用的函数不能作为表达式解析的情况(这可能不是一个好的设计模式)。
但我会满足于一个只用于函数和其他在定义后永远不会作为普通表达式出现的对象的方法。
解决方法
这会给你一个部分答案(从原文编辑):
pkg <- "testpkg"
library(pkg,character.only = TRUE)
ns <- getNamespace(pkg)
allnames <- ls(ns)
exports <- ls(paste0("package:",pkg))
nsInfo <- readRDS(system.file("Meta/nsInfo.rds",package = pkg))
if (!is.null(nsInfo$S3methods)) {
S3methods <- with(nsInfo,paste(S3methods[,1],S3methods[,2],sep = "."))
} else
S3methods <- NULL
locals <- setdiff(allnames,c(exports,S3methods))
used <- character()
newones <- c(exports,S3methods)
while (length(newones)) {
mentioned <- unique(unlist(lapply(newones,function(n) {
fun <- get(n,envir = ns)
if (is.function(fun))
codetools::findGlobals(fun)
})))
used <- c(used,newones)
newones <- setdiff(intersect(mentioned,locals),used)
}
unused <- setdiff(locals,used)
unused
这仍然不太正确,但它应该可以帮助您入门。一些问题:
- 它假设没有函数在做
assign()
之类的有趣的事情,或者摆弄 环境等 - 它不会检测完全用于构建其他函数的函数 包中的对象。
- 它不会检测使用非标准名称声明的奇怪 S3 方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。