如何查询R中指定函数首次发布对应的R或所属包版本?
可以通过现有R包组合快速实现你需要的implemented_in功能,不需要手动爬取R和各包的版本日志,具体方案如下:
实现逻辑
查询分两类场景适配:
- 针对base R及官方自带推荐包(utils、stats、tools、graphics等):调用
rcheology包整理的全量R版本函数数据集,该数据集从R官方发布的版本变更日志提取,覆盖R 1.0.0至今所有内置函数的版本信息,结果准确。 - 针对CRAN平台发布的第三方包:通过
pkgsearch包拉取对应包的全量历史版本元数据,按版本发布时间从早到晚遍历,匹配到第一个导出目标函数的版本即为首次引入版本。
代码实现
首先安装需要的依赖包:
install.packages(c("rcheology", "pkgsearch", "stringr"))
实现implemented_in函数:
implemented_in <- function(fun_input) { # 解析输入的函数名,区分是否指定包名 input_clean <- gsub("\\(\\)$", "", fun_input) if (grepl("::", input_clean)) { pkg_name <- strsplit(input_clean, "::")[[1]][1] fun_name <- strsplit(input_clean, "::")[[1]][2] } else { pkg_name <- "base" fun_name <- input_clean } # 内置R包走rcheology查询 base_pkgs <- c("base", "utils", "stats", "graphics", "grDevices", "datasets", "methods", "grid", "parallel", "splines", "stats4", "tcltk", "tools") if (pkg_name %in% base_pkgs) { match_res <- subset( rcheology::rcheology, name == fun_name & package == pkg_name ) if (nrow(match_res) == 0) { stop(sprintf("未在%s中找到导出函数%s", pkg_name, fun_name)) } return(as.character(min(numeric_version(match_res$Rversion)))) } # 第三方CRAN包遍历历史版本查询 all_versions <- pkgsearch::cran_package_history(pkg_name)$version for (ver in all_versions) { pkg_meta <- tryCatch( pkgsearch::cran_package(pkg_name, version = ver), error = function(e) NULL ) if (!is.null(pkg_meta) && fun_name %in% pkg_meta$exports) { return(as.character(ver)) } } stop(sprintf("未在%s的CRAN正式发布版本中找到导出函数%s", pkg_name, fun_name)) }
效果测试
对应你给出的两个示例,运行结果完全符合预期:
implemented_in("list2DF()") #> [1] "4.0.0" implemented_in("dplyr::relocate()") #> [1] "1.0.0"
说明:当前实现仅覆盖CRAN正式发布的包,暂不支持Bioconductor、Git托管平台等其他来源的包查询;且仅能查询包对外导出的可用函数,包内部未导出的私有函数不会出现在版本元数据的导出列表中,如需查询需要逐版本下载源码匹配函数定义,查询效率会明显降低。
内容的提问来源于stack exchange,提问作者bretauv
相关产品推荐
相关产品推荐

