Какова цель загрузки пакета в функцию? - PullRequest
0 голосов
/ 25 июня 2018

Я попытался найти разницу между library() и require() и нашел здесь пост, который хорошо объясняет: В чем разница между require () и library ()?

В этом посте они говорят о том, как бы вы использовали require() в функции и library() в верхней части скрипта.В связи с этим возникает мой вопрос: какова цель загрузки пакетов в функцию по сравнению с верхней частью скрипта?Какая польза от этого?

Спасибо!

1 Ответ

0 голосов
/ 25 июня 2018

Чтобы подробнее остановиться на комментарии @alistaire, я думаю, что важной частью является использование нотации ::, где это возможно (извините, что сделал это ответом, однако я хотел использовать некоторый код, который не вписывается в комментарий).Общая идея состоит в том, чтобы сохранить NAMESPACE настолько чистым, насколько это возможно, и вызывать определенные функции только при необходимости, то есть использовать их временно и не загружать их постоянно в текущем сеансе.Конечно, они все еще должны быть установлены в системе для возможности их загрузки.Временная загрузка позволяет избежать конфликтов или других побочных эффектов, например, когда два разных пакета используют одно и то же имя для функций, которые, однако, выполняют разные функции.

Для иллюстрации проблемы, связанной с пространством имен, вы можете проверить приведенный ниже код, вам необходимо установить библиотеку stringi, которую я только что использовал в качестве примера.Надеюсь, это поможет.

# load a library and check if its loaded
library(stringi)
names(sessionInfo()$otherPkgs)
# [1] "stringi"
# detach it
detach("package:stringi", unload = TRUE)
names(sessionInfo()$otherPkgs)
# NULL

# use library with :: notation, e.g., within function
my_fun <- function(x) {
  stringi::stri_replace_all_fixed(x, "a", "b")
}
my_fun("aaa")
# [1] "bbb"

# check if library is loaded
names(sessionInfo()$otherPkgs)
# NULL -> it is not loaded, hence, the namespace is kept clean
...