Как R различает две функции фильтра: одну в пакете dplyr и другую для линейной фильтрации во временных рядах? - PullRequest
0 голосов
/ 09 февраля 2020

Я хотел отфильтровать набор данных на основе некоторых условий. Когда я посмотрел на справку по функции фильтра, результат был:

filter {stats}  R Documentation
Linear Filtering on a Time Series
Description
Applies linear filtering to a univariate time series or to each series separately of a multivariate time series.

После поиска в Интернете я нашел нужную функцию фильтра, то есть из пакета dplyr. Как R может иметь две функции с одинаковым именем. Что мне здесь не хватает?

1 Ответ

2 голосов
/ 09 февраля 2020

В настоящий момент интерпретатор R отправит вызов filter в среду dplyr, по крайней мере, если бы класс объекта был среди доступных методов:

методы (фильтр) [1 ] filter.data.frame * filter.default * filter.sf * filter.tbl_cube * filter.tbl_df * filter.tbl_lazy *
[7] filter.ts *

Как вы можете видеть, есть ts, так что если бы объект принадлежал к этому классу, интерпретатор вместо этого доставил бы ему значения x. Однако, похоже, что авторы dplyr заблокировали этот механизм и вместо этого включили функцию предупреждения. Вам нужно будет использовать:

getFromNamespace('filter', 'stats')
function (x, filter, method = c("convolution", "recursive"), 
    sides = 2L, circular = FALSE, init = NULL) 
{  <omitting rest of function body> }

# same result also obtained with:
stats::filter

R функции содержатся в пространствах имен, поэтому полное обозначение функции будет: namespace_name::function_name. Существует иерархия контейнеров пространства имен (фактически «среды» в терминологии R), расположенных вдоль пути поиска (который будет варьироваться в зависимости от порядка загрузки пакетов и их зависимостей). Оператор :: -infix может использоваться для указания пространства имен или имени пакета, которое находится дальше по пути поиска, чем может быть найдено в контексте вызывающей функции. Функция search может отображать имена загруженных в данный момент пакетов и связанные с ними пространства имен. См. ?search Вот мой на данный момент (который довольно раздутый, потому что я отвечаю на многие вопросы и обычно не начинаю с чистых систем:

> search()
 [1] ".GlobalEnv"                "package:kernlab"           "package:mice"              "package:plotrix"          
 [5] "package:survey"            "package:Matrix"            "package:grid"              "package:DHARMa"           
 [9] "package:eha"               "train"                     "package:SPARQL"            "package:RCurl"            
[13] "package:XML"               "package:rnaturalearthdata" "package:rnaturalearth"     "package:sf"               
[17] "package:plotly"            "package:rms"               "package:SparseM"           "package:Hmisc"            
[21] "package:Formula"           "package:survival"          "package:lattice"           "package:remotes"          
[25] "package:forcats"           "package:stringr"           "package:dplyr"             "package:purrr"            
[29] "package:readr"             "package:tidyr"             "package:tibble"            "package:ggplot2"          
[33] "package:tidyverse"         "tools:rstudio"             "package:stats"             "package:graphics"         
[37] "package:grDevices"         "package:utils"             "package:datasets"          "package:methods"          
[41] "Autoloads"

В данный момент я могу найти примеры из 3-х версий фильтра с помощью справочной системы:

?filter

# brings this up in the help panel

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

Return rows with matching conditions
(in package dplyr in library /home/david/R/x86_64-pc-linux-gnu-library/3.5.1)
Linear Filtering on a Time Series
(in package stats in library /usr/lib/R/library)
Objects exported from other packages
(in package plotly in library /home/david/R/x86_64-pc-linux-gnu-library/3.5.1)
...