R разработка пакета: когда использовать ::

вопрос об удобстве кодирования: я работаю над пакетом r и хочу отправить его в Cran. Все внешние функции правильно импортированы в файл NAMESPACE. Должен ли я использовать ::, чтобы указать пакет в моем исходном коде, или все в порядке, предоставив импорт в пространстве имен? Пример В NAMESPACE есть что-то вроде

importFrom(stats, formula, ave, aggregate, median, sd, qnorm, rnorm, runif)

Должен ли я явно вызывать статистику при использовании, например, rnorm

random <- stats::rnorm(100, m = 0, sd = 1)

или я могу опустить 'stats ::' в отношении политик кранов?

Определенно лучше, если вы используете stats:: в своем коде.

nicola 07.09.2018 12:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
59
2

Ответы 2

Если вы используете importFrom, это не необходимо; из Пакеты R Хэдли Уикхэм:

If you are using just a few functions from another package, my recommendation is to note the package name in the Imports: field of the DESCRIPTION file and call the function(s) explicitly using ::, e.g., pkg::fun(). Operators can also be imported in a similar manner, e.g., @importFrom magrittr %>%.

If you are using functions repeatedly, you can avoid :: by importing the function with @importFrom pkg fun. This also has a small performance benefit, because :: adds approximately 5 µs to function evaluation time.

Однако многие считают, что использование :: является хорошей практикой с точки зрения того, чтобы сделать ваш код явным и читаемым; если кто-нибудь посмотрит на ваш исходный код, он точно знает, откуда берутся вызываемые вами функции.

Большое спасибо (всем) за очень быстрые ответы. Таким образом, вызов является более или менее проблемой производительности при повторном вызове, например. грамм. в итеративных функциях, я думаю, и если это не проблема, следует добавить :: для удобства чтения, верно? А как насчет вызовов функций из моего собственного пакета? Стоит ли добавлять :: или вообще нет?

user1227776 07.09.2018 12:54

@ user1227776 Верно. Я почти всегда использую :: из-за проблемы с читабельностью, но при повторном вызове можно повысить производительность. Каждое использование :: добавляет около 5 микросекунд, так что это зависит от вас и в значительной степени зависит от контекста, достаточно ли это повышения производительности, чтобы затруднить читаемость.

duckmayr 07.09.2018 12:56

@ user1227776 Я только что заметил последнее предложение в вашем комментарии. Вам не нужен :: для функций из вашего собственного пакета.

duckmayr 07.09.2018 13:07

Вам не нужно использовать :: в вашем коде. Импорт этих элементов делает их доступными локально.

Как сказал Никола, есть аргументы, почему вы могли бы использовать ::. Это дает понять, откуда взялась функция. Однако, если вы все же используете ::, нет смысла импортировать функцию: объект rnorm, импортированный в ваше пространство имен, будет проигнорирован.

Для себя я бы скорее импортировал, чем использовал ::. Вызов импортированной функции имеет меньше накладных расходов, чем вызов :: для разрешения вызова во внешний пакет.

Другие вопросы по теме