2016-03-29 2 views
4

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

Например, мой файл global.r содержит несколько функций, которые мне нужны для блестящего приложения. В настоящее время у меня есть все необходимые пакеты в верхней части файла. Когда я переключаю проекты/копируя эти функции, мне приходится загружать пакеты/включать их в новый код. В противном случае все необходимые пакеты содержатся в этой функции. Конечно, мне нужно проверить все функции с помощью нового сеанса R, но я думаю, что это может помочь в долгосрочной перспективе.

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

Я только видел эту практику, библиотека вызывает внутри функции, поэтому я не уверен.

+4

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

+1

@ G.Grothendieck: это должен быть ответ. :) –

+0

Вы можете рассмотреть возможность размещения ваших функций в пакете. Это позволит вам лучше контролировать, хотите ли вы загружать другие пакеты или импортировать все или только некоторые функции из них. – Roland

ответ

5

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

  1. Функция теперь имеет глобальный эффект - как правило, это что-то, чтобы избежать.
  2. Существует очень небольшой удар производительности.

Первый пункт - большой. Как и в большинстве оптимизаций, беспокоиться только о втором вопросе, если это проблема.

Теперь, когда мы установили принцип, каково возможное решение.

  1. В небольших проектах, у меня есть файл с именем packages.R, который включает в себя все library звонков мне нужно. Это находится в верхней части моего сценария анализа. BTW, все мои функции находятся в вызове файла func.R. Этот рабочий процесс был украден/адаптирован с предыдущего SO question

  2. Если вы импортируете только одну функцию, вы можете использовать трюк ::, например. package::funcA(...) Таким образом, вы избегаете загрузки пакета.

  3. Для больших проектов я создаю пакет R, который обрабатывает все необходимые импорты. Преимущества создания пакета подробно описаны в этом answer о структурировании больших проектов R.

+0

Благодарим вас за понимание. Я собираюсь структурировать свои функции во внутреннем отклике, так как этот проект стал действительно беспорядочным в последние месяцы. – Sebastian

Смежные вопросы