Можно ли управлять конфликтами пакетов R, явно ссылаясь на пакеты в вызовах функций?

Мне не нравится, что у вас могут быть конфликты пакетов R при вызовах функций или конфликты пространств имен. Например, plyr и dplyr имеют функции с одинаковыми именами, поэтому, если они оба загружены, вам нужно знать, какие это функции, чтобы вы могли соответствующим образом присоединять и отсоединять пакеты. Конечно, в этом примере dplyr предназначен для замены plyr, из-за чего возникают конфликты, но гипотетически это может произойти с любым количеством пакетов. Какой кошмар! Это не проблема в Python, потому что вы добавляете префикс к вызову функции с именем/псевдонимом импортированного вами пакета, например. pd.melt().

Итак, мой вопрос: есть ли эквивалентный способ сделать это в R? Можно ли управлять конфликтами пакетов, явно ссылаясь на пакет в вызове функции?

Я вижу, что кто-то задал в основном тот же вопрос здесь шесть лет назад, и это остается нерешенным. Единственный предлагаемый ответ — проверить пакет conflicted. Это начало, обеспечивающее прозрачность конфликтов, но вам придется покопаться в пакете, чтобы найти что-то лучшее (обновление: см. комментарии ниже, чтобы найти ссылки на наиболее полезные функции пакета). по этому вопросу).

Обновить

В комментариях есть ряд решений, в том числе найденных в этот пост. Но, хотя этот пост отвечает на мой вопрос, он его не задает, что может быть одной из причин, по которой я не нашел его в своем поиске. Это начинается с предположения, что вы уже знаете быстрое и грязное решение использования правильного синтаксиса префикса. Так что, возможно, лучше оставить этот пост как не дублирующийся для будущих искателей.


person Kaleb Coberly    schedule 16.12.2020    source источник
comment
Вы можете использовать, например, dplyr::mutate() или plyr::mutate() для явной ссылки на пакет в вызове функции.   -  person Gregor Thomas    schedule 16.12.2020
comment
Также я думаю, что вы недооцениваете пакет conflicted, он предлагает функциональность, выходящую за рамки прозрачности. Может быть, вы путаете его с базовой функцией conflicts(), которая предлагает только прозрачность? Как показано на виньетке с пакетом, вы можете, например, использовать conflicted::conflict_prefer("filter", "dplyr"). И в конце (короткой) виньетки есть раздел Альтернативы, в котором упоминаются два других пакета, на которые вы могли бы обратить внимание, import и modules, оба из которых дают решение, более похожее на Python.   -  person Gregor Thomas    schedule 16.12.2020
comment
Отвечает ли это на ваш вопрос? Хорошо ли вызывать функции в пакете через ::. Обратите внимание на автора принятого ответа. =П   -  person Ian Campbell    schedule 16.12.2020
comment
@ГрегорТомас, спасибо! Это именно то, что я искал. Ха-ха, просматривая информацию о пакете конфликтов, я случайно впервые наткнулся на этот синтаксис. Я только неделю в R, лол, и я думаю, что это видно.   -  person Kaleb Coberly    schedule 16.12.2020
comment
@GregorThomas, да, я обязательно изучу conflicted.   -  person Kaleb Coberly    schedule 16.12.2020


Ответы (1)


Просто добавьте к имени пакета двойное двоеточие:

<package>::<function>()

Например:

ggplot2::ggplot(data=data, ggplot2::aes(x=x)) +
    ggplot2::geom_histogram()
person Kaleb Coberly    schedule 16.12.2020