Как узнать, какой пакет содержит текущую функцию в R? - PullRequest
3 голосов
/ 25 мая 2020

Когда я ?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()?

Ответы [ 2 ]

2 голосов
/ 25 мая 2020

Общее c решение - проверить topenv(environment(function_name)) (и потенциально вызвать environmentName по результату). Но простая печать function_name (т.е. использование имени без его вызова) также работает.

Тем не менее, это обычно не должно использоваться как механизм во время выполнения; вместо этого убедитесь, что ожидаемые пакеты загружены. Проще всего это сделать:

  1. Либо используйте явную квалификацию пространства имен, то есть dplyr::filter вместо filter; это лучшая практика для большинства современных языков, но она может быть довольно обременительной, особенно при исследовательском анализе.
  2. Всегда используйте library вместо require при импорте пакета. В отличие от require, library вызовет ошибку, если соответствующий пакет не может быть загружен.
2 голосов
/ 25 мая 2020

Вы можете сделать следующее, чтобы найти имя пакета, из которого функция в настоящее время загружена из

environmentName(environment(filter))

Что касается его обработки, я бы использовал stats::filter() или dplyr::filter(), если это всего несколько использует или объявляет одну как новую функцию altogther

filter_stats <- stats::filter
filter_stats()

Библиотека conflicted также полезна для конфликтов, особенно с conflict_scout() и conflict_prefer(). Например, вы можете сделать conflict_prefer("filter", "stats"), чтобы переопределить поведение по умолчанию самого последнего пакета, имеющего приоритет. Есть несколько других альтернативных методов, упомянутых в файле readme для конфликтующих библиотек.

Существуют также базовые вызовы conflicts() или conflicts(detail = TRUE).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...