在加载许多包时确定哪个版本的功能处于活动状态

Determining which version of a function is active when many packages are loaded

如果我加载了多个定义同名函数的包,是否有一种简单的方法可以确定哪个版本的函数当前处于活动状态?比如,假设我加载了 base R、tidyverse 和一堆时间序列包。我想要一个函数 which_package("intersect") 来告诉我相交函数的活动版本的包名称。我知道你可以回头看看你在安装软件包时收到的所有警告信息,但我认为这种手动搜索不仅乏味而且容易出错。

有一个函数 可以满足我的要求,除了它会为所有冲突生成 table 而不是为一个函数生成值。我实际上对此非常满意,并且也会接受类似的功能作为答案,但我在给定功能的实现方面遇到了问题。应用于我的示例时,它插入了大量的白色 space 和许多重复的包名称(例如 %>% 函数显示列出了 132 个包),使输出难以阅读和使用。看起来应该很容易删除白色 space 和重复项,并且我花了相当多的时间在我期望工作但对结果没有影响的各种方法上。

所以,举一个很多冲突的例子:

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)
}

对于您在全局环境中定义的函数,这将 return R_GlobalEnv。如果您真的只想将其限制为包,还有 packageName 函数。 例如

library(MASS)
library(dplyr)
which_package(select)
# [1] "dplyr"