如何知道 R 中哪个包保存当前函数?

Posted

技术标签:

【中文标题】如何知道 R 中哪个包保存当前函数?【英文标题】:How to know which package hold current function in R? 【发布时间】:2020-09-12 06:00:13 【问题描述】:

当我?filter时,Rstudio让我选择:

Help on topic 'filter' was found in the following packages:

Linear Filtering on a Time Series
(in package stats in library C:/Program Files/R/R-3.5.3/library)
Return rows with matching conditions
(in package dplyr in library C:/Users/me/Documents/.checkpoint/2019-12-11/lib/x86_64-w64-mingw32/3.5.3)

当我在脚本中使用filter() 时,如何知道是stats::filter() 还是dplyr::filter()

【问题讨论】:

只需输入filter 而不输入() 并查看<environment: namespace:stats><environment: namespace:dplyr> 【参考方案1】:

您可以执行以下操作来查找当前加载函数的包名称

environmentName(environment(filter))

至于处理它,我会坚持使用stats::filter()dplyr::filter(),如果它只是少数用途或将一个声明为新功能

filter_stats <- stats::filter
filter_stats()

conflicted 也可用于处理冲突,尤其是与conflict_scout()conflict_prefer() 的冲突。例如,您可以使用conflict_prefer("filter", "stats") 来覆盖优先考虑最新包的默认行为。 There are a few other alternative methods mentioned on the conflicted libraries readme.

还有基本调用conflicts()conflicts(detail = TRUE)

【讨论】:

【参考方案2】:

通用解决方案是检查topenv(environment(function_name))(并可能在结果上调用environmentName)。但仅打印 function_name(即使用名称而不调用它)也可以。

也就是说,这通常不应用作运行时的机制;相反,请确保已加载预期的包。最简单的方法是:

    使用显式命名空间限定,即dplyr::filter 而不是filter;这是大多数现代语言中的最佳做法,但它可能相当繁琐,尤其是在进行探索性分析时。 Always use library instead of require 导入包时。与require 不同,library 会在相应的包无法加载时引发错误。

【讨论】:

那么,如果我想使用base::function,我应该在函数名前加上base::吗? @kittygirl 好问题。 一般人们不会这样做。首先,这是不切实际的,因为生成的 R 代码非常难以阅读。其次,当人们从 'base' 覆盖名称时(他们很少这样做!),他们通常倾向于以这样的方式来做,即该函数可以用作 'base' 函数的替代品,并且否则通常被视为不好的风格。最终,我不知道有任何人明确使用base::,除非在特定情况下。

以上是关于如何知道 R 中哪个包保存当前函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中保存函数的结果而不返回它?

R语言中知道一个函数名,怎么查找R对应的函数包,比如dapc,想知道它在哪个函数包里才可以调用

在加载包之前如何知道特定函数属于哪个包?

R语言使用load函数将过往保存的工作空间镜像文件(RData)加载到当前会话使用q函数关闭当前工作空间(系统会提示是否保存或者取消)

如何在Matlab中保存文件及导入文件

如何将 R 子文件保存到特定文件夹中?