问题描述
如果我加载了多个定义同名函数的包,是否有一种简单的方法来确定当前哪个版本的函数是活动的?比如,假设我已经加载了基础 R、tidyverse 和一堆时间序列包。我想要一个函数 which_package("intersect")
来告诉我 intersect 函数的活动版本的包名称。我知道您可以返回查看安装软件包时收到的所有警告消息,但我认为这种手动搜索不仅乏味而且容易出错。
有一个函数 here 可以做我想要的,除了它为所有冲突生成一个表而不是一个函数的值。我实际上会对此感到非常满意,并且也会接受类似的功能作为答案,但是我在给定的功能实现方面遇到了问题。在我的示例中,它插入了大量空白和许多包名称的重复项(例如 %>% 函数显示列出了 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","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"