r - 在加载许多包时确定哪个版本的函数处于活动状态
问题描述
如果我加载了多个定义同名函数的包,是否有一种简单的方法可以确定当前哪个版本的函数是活动的?比如,假设我已经加载了基础 R、tidyverse 和一堆时间序列包。我想要一个函数which_package("intersect")
,它可以告诉我 intersect 函数的活动版本的包名称。我知道您可以返回查看安装软件包时收到的所有警告消息,但我认为这种手动搜索不仅乏味而且容易出错。
这里有一个函数可以做我想要的,除了它为所有冲突生成一个表,而不是为一个函数生成一个值。我实际上会对此感到非常满意,并且也会接受类似的功能作为答案,但是我对给定功能的实现有疑问。在我的示例中,它插入了大量的空格和许多重复的包名(例如,%>% 函数显示了列出的 132 个包),使得输出难以阅读和使用。似乎删除空白和重复项应该很容易,而且我已经花了相当多的时间在我希望工作但对结果没有影响的各种方法上。
因此,对于许多冲突的示例:
install.packages(pkg = c("tidyverse", "fpp3", "tsbox", "rugarch", "Quandl", "DREGAR", "dynlm", "zoo", "GGally", "dyn", "ARDL", "bigtime", "BigVAR", "dLagM", "VARshrink")
lapply(x = c("tidyverse", "fable", "tsbox", "rugarch", "Quandl", "DREGAR", "dynlm", "zoo", "GGally", "dyn", "ARDL", "bigtime", "BigVAR", "dLagM", "VARshrink"),
library, character.only = TRUE)
解决方案
您可以使用自己的函数助手提取此信息。
which_package <- function(fun) {
if(is.character(fun)) fun <- getFunction(fun)
stopifnot(is.function(fun))
x <- environmentName(environment(fun))
if (!is.null(x)) return(x)
}
这将为您在全局环境中定义的函数返回 R_GlobalEnv。packageName
如果您真的想将其限制为仅包,也可以使用该功能。例如
library(MASS)
library(dplyr)
which_package(select)
# [1] "dplyr"