【问题标题】:How to know which package hold current function in R?如何知道 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>

标签: r


【解决方案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(即使用名称而不调用它)也可以。

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

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

    【讨论】:

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