Обложка канала

R4marketing | канал Алексея Селезнёва | Язык R

Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.

R4marketing | канал Алексея Селезнёва | Язык R

4 года назад
Открыть в
​​Решение конфликта имён функций между пакетами Не редко вы можете столкнуться с ситуацией, когда в используемых вами пакетах присутствуют функции с одинаковым именем. При подключении пакетов, по умолчанию R отдаёт преимущество функции, экспортируемой из пакета, который был подключён последним. Например если вы подключили два пакета, сначала pack1, потом pack2, и в обоих присутствует функция fun(), то в ходе сеанса fun() будет использовать из pack2, т.к. он был подключён последним. Такое поведение логично, но не всегда удобно. поэтому есть несколько способов управлять политикой приоритетности функций между пакетами, сейчас мы рассмотрим несколько таких вариантов. Пакет conflicted позволяет установить приоритет с помощью функции conflict_prefer():
 
library(conflicted)
library(dplyr)
conflict_prefer("filter", "dplyr")
Посмотреть существующие конфликты текущей сессии можно так:
 
conflict_scout()
#> 2 conflicts:
#> * `filter`: [dplyr]
#> * `lag`   : dplyr, stats
Более гибкую возможность управления конфликтами предоставляет пакет modules, он создаёт отдельное окружение под каждый пакет, этот подход очень похож на то, как происходит импорт пакетов в python:
 
dplyr <- modules::import_package('dplyr')
dplyr$filter(mtcars, cyl == 8)
Пакет import ожидает, что вы явно присвоите новые имена конфликтным функциям:
 
import::from(dplyr, select, arrange, dplyr_filter = filter)
dplyr_filter(mtcars, cyl == 8)
В базовом синтаксисе для управление приоритетами можно использовать опцию conflicts.policy или функцию conflictRules():
 
options(conflicts.policy =
            list(error = TRUE,
                 generics.ok = TRUE,
                 can.mask = c("base", "methods", "utils",
                              "grDevices", "graphics",
                              "stats"),
                 depends.ok = TRUE))
Где: ● error - Если TRUE, то конфликты приводят к ошибкам; ● generics.ok - Если установлено, то определяет, считается ли маскирование обобщённых (дженерик) функций S4 конфликтом. По умолчанию - FALSE, строгая проверка - TRUE; ● can.mask - Вектор имен пакетов, которые разрешено маскировать без возникновения ошибки; ● depends.ok - Если TRUE, то разрешить все конфликты, возникающие при загрузке пакета; ● warn - Устанавливает значение по умолчанию для аргумента warn.conflicts в library() и require(). #заметки_по_R