【问题标题】:R: 2 functions with the same name in 2 different packagesR:2个不同包中的2个同名函数
【发布时间】:2011-07-30 16:34:44
【问题描述】:

我需要加载到 R 包:tseries 和 chron

两者都有一个名为 is.weekend 的函数

我的环境中总是有我加载的第二个包中的函数。

我怎样才能始终从 chron 访问该功能?

【问题讨论】:

标签: function r packages conflict


【解决方案1】:

您可能已经注意到,加载包的顺序会有所不同,即最后加载的包将掩盖之前加载的包中的功能。

要指定要使用的包,语法是:

chron::is.weekend()
tseries::is.weekend()

换句话说,使用packagename::functionname()

另外,如果你知道你会一直想使用chron中的函数,你可以定义自己的函数如下:

is.weekend <- chron::is.weekend    #EDIT

【讨论】:

  • is.weekend&lt;-chron::is.weekend 就够了。
  • 此处不相关,因此仅供此线程中的未来参考:如果函数导出(即您想要特定的 S3 方法并且该方法未导出但generic is) 那么::: 操作符是必需的。
  • @Gavin 没错,但我总是非常谨慎地提及未导出的函数。大概包作者没有导出它是有原因的,并且可以在没有警告的情况下更改功能。为了保护依赖于此类函数的代码,最好说服包作者导出此函数,或者获得在您自己的代码中重用的权限。
  • 我完全同意包中的生产代码。对于个人使用,只要存档包源的确切版本并记录数据分析代码中使用的包版本的详细信息,我就不会看到问题。当然,这适用于所有包代码的使用,因为你是在包开发人员的心血来潮改变事情,所有代码可能包含一些错误......在我看来,关键问题是可重复性,其余的我们必须接受并接受,但至少有一个可以查看代码并检查它是否适用于 R 和(大多数)R 包。
  • @LauriK 使用 base::`%in%``%in%` &lt;- base::`%in%`
【解决方案2】:
library(chron)
is.weekend.chron <- is.weekend
library(tseries)

那么你可以为 tseries 版本调用 is.weekend 或为 chron 版本调用 is.weekend.chron

【讨论】:

    【解决方案3】:

    您应该使用 Hadly 的 conflicted 包。

    library(conflicted)
    library(dplyr)
    filter(mtcars, am & cyl == 8)
    

    那么冲突包会抛出错误,并强制你清楚地确定你喜欢哪个函数:

    错误:在 2 个包中找到过滤器。你必须用 :: 指明你想要哪一个 * dplyr::过滤器 * 统计::过滤器

    要解决整个会话的冲突,请使用&lt;-

    filter <- dplyr::filter
    filter(mtcars, am & cyl == 8)
    
        mpg cyl disp  hp drat   wt qsec vs am gear carb
    1 15.8   8  351 264 4.22 3.17 14.5  0  1    5    4
    2 15.0   8  301 335 3.54 3.57 14.6  0  1    5    8
    

    您也可以使用conflict_prefer() 函数,该函数可以在发生冲突时确定获胜者。 代码示例是从 Hadly 借来的,请参考软件包网站。 https://www.tidyverse.org/blog/2018/06/conflicted/

    【讨论】:

      【解决方案4】:

      我有 2 个具有相同函数名 ts() 的包 有相同的两个包是:

      1. 预测
      2. 列表项

      我通过键入检查了发生的情况

      ?ts
      
      
      Help on topic 'ts' was found in the following packages:
      
      Time-Series Objects
      (in package stats in library C:/Program Files/R/R-3.6.2/library)
      Format time stamps
      (in package bReeze in library C:/Users/mycomputer/Documents/R/win-library/3.6)
      

      解决方法:那就使用包预测自带的ts函数 我用过:因为帮助告诉我预测正在调用统计数据

      时间序列对象(在包统计中

      stats::ts
      

      因为从帮助中可以看出,预测使用了一个名为 stats 的包;)

      forecast::ts
      
      Time-Series Objects
      (in package stats
      

      给了我错误,因为预测包正在使用子包;

      所以最终的用法是这样的:

      library(bReeze)
      library(forecast)
      
      # Subset data
      my_time_series <- stats::ts(c(df_sub$y), start=2018, frequency = 12)
      
      # Plot
      theme_set(theme_classic())
      ggseasonplot(my_time_series) + labs(title="My graph title")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        • 2018-09-14
        • 2020-02-22
        相关资源
        最近更新 更多