【发布时间】:2020-12-22 16:09:38
【问题描述】:
我正在重构一个包含许多非导出函数和其他非导出对象的包。除了手动对包中每个函数的名称进行全文搜索之外,有没有一种方法可以快速识别包中已定义但未导出或调用的所有“孤立”对象?
另外一个复杂的问题是在glue f 风格的字符串中调用了一些函数,因此在某些情况下调用的函数可能无法解析为表达式(这可能不是一个好的设计模式)。
但我会满足于只用于函数和其他对象的方法,这些对象在定义后永远不会作为普通表达式出现。
【问题讨论】:
我正在重构一个包含许多非导出函数和其他非导出对象的包。除了手动对包中每个函数的名称进行全文搜索之外,有没有一种方法可以快速识别包中已定义但未导出或调用的所有“孤立”对象?
另外一个复杂的问题是在glue f 风格的字符串中调用了一些函数,因此在某些情况下调用的函数可能无法解析为表达式(这可能不是一个好的设计模式)。
但我会满足于只用于函数和其他对象的方法,这些对象在定义后永远不会作为普通表达式出现。
【问题讨论】:
这会给你一个部分答案(从原文编辑):
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(),或者摆弄
与环境等。【讨论】: