вопрос об удобстве кодирования: я работаю над пакетом r и хочу отправить его в Cran. Все внешние функции правильно импортированы в файл NAMESPACE. Должен ли я использовать ::, чтобы указать пакет в моем исходном коде, или все в порядке, предоставив импорт в пространстве имен? Пример В NAMESPACE есть что-то вроде
importFrom(stats, formula, ave, aggregate, median, sd, qnorm, rnorm, runif)
Должен ли я явно вызывать статистику при использовании, например, rnorm
random <- stats::rnorm(100, m = 0, sd = 1)
или я могу опустить 'stats ::' в отношении политик кранов?
Если вы используете 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 Верно. Я почти всегда использую ::
из-за проблемы с читабельностью, но при повторном вызове можно повысить производительность. Каждое использование ::
добавляет около 5 микросекунд, так что это зависит от вас и в значительной степени зависит от контекста, достаточно ли это повышения производительности, чтобы затруднить читаемость.
@ user1227776 Я только что заметил последнее предложение в вашем комментарии. Вам не нужен ::
для функций из вашего собственного пакета.
Вам не нужно использовать ::
в вашем коде. Импорт этих элементов делает их доступными локально.
Как сказал Никола, есть аргументы, почему вы могли бы использовать ::
. Это дает понять, откуда взялась функция. Однако, если вы все же используете ::
, нет смысла импортировать функцию: объект rnorm
, импортированный в ваше пространство имен, будет проигнорирован.
Для себя я бы скорее импортировал, чем использовал ::
. Вызов импортированной функции имеет меньше накладных расходов, чем вызов ::
для разрешения вызова во внешний пакет.
Определенно лучше, если вы используете
stats::
в своем коде.