如何知道 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对应的函数包,比如dapc,想知道它在哪个函数包里才可以调用
R语言使用load函数将过往保存的工作空间镜像文件(RData)加载到当前会话使用q函数关闭当前工作空间(系统会提示是否保存或者取消)