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

问题描述

如果我加载了多个定义同名函数的包,是否有一种简单的方法来确定当前哪个版本的函数是活动的?比如,假设我已经加载了基础 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"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...