当加载另一个具有filter 函数的非基础 R 包时,就会发生这种情况。
包dplyr 是问题错误的主要负责人。不是因为这个包有什么问题,而是恰恰相反,因为它所属的 tidyverse 被广泛采用,以至于stats::filter 和dplyr::filter 之间的冲突是迄今为止最常见的情况。
第一个示例在新的 R 会话中运行。
w <- rnorm(150,0,1) # 50 extra to avoid startup problems
x <- filter(w, filter=c(1,-.9), method="recursive")[-(1:50)] # remove first 50
plot.ts(x, main="autoregression")
创建于 2022 年 10 月 2 日,reprex v2.0.2
错误
现在加载包dplyr 并运行完全相同的代码。 R 的命名空间加载代码预测包之间的冲突,并且警告用户两个对象被包stats 屏蔽,其中一个是filter,另外4 个来自包base。
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
w <- rnorm(150,0,1) # 50 extra to avoid startup problems
x <- filter(w, filter=c(1,-.9), method="recursive")[-(1:50)] # remove first 50
#> Error in UseMethod("filter"):
#> no applicable method for 'filter' applied to an object of class "c('double', 'numeric')"
创建于 2022 年 10 月 2 日,reprex v2.0.2
解决方案
解决方案是使用限定名称stats::filter。
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
w <- rnorm(150,0,1) # 50 extra to avoid startup problems
x <- stats::filter(w, filter=c(1,-.9), method="recursive")[-(1:50)] # remove first 50
plot.ts(x, main="autoregression")
创建于 2022-10-02,reprex v2.0.2