Какое влияние требуется на пакет внутри функции, если пакет уже загружен?

Есть ли какой-либо неблагоприятный эффект для включения операторов library/require внутри функций, которые будут вызываться очень часто?

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

Кстати, любое представление о том, почему library наполовину меньше, чем require? У меня было такое впечатление, что они были синонимами.

  WithREQUIRE <- function(x) {
    require(stringr)
    str_detect(x, "hello")
  }

  WithLIBRARY <- function(x) {
    library(stringr)
    str_detect(x, "hello")
  }

  Without <- function(x) {
    str_detect(x, "hello")
  }

  x <- "goodbye"

  library(rbenchmark)
  benchmark(WithREQUIRE(x), WithLIBRARY(X), Without(x), replications=1e3, order="relative")

  #            test replications elapsed relative user.self sys.self
  #      Without(x)         1000   0.592    1.000     0.262    0.006
  #  WithREQUIRE(x)         1000   0.650    1.098     0.295    0.015
  #  WithLIBRARY(X)         1000   1.359    2.296     0.572    0.024

Ответ 1

require проверяет, загружен ли пакет (на пути поиска)

используя

loaded <- paste("package", package, sep = ":") %in% search()

и будет выполняться только при загрузке, если это FALSE

library включает аналогичный тест, но немного больше stuff, когда это TRUE (включая создание списка доступных пакетов.

require продолжается с помощью вызова tryCatch в библиотеку и создаст сообщение.

Таким образом, один вызов library или require, когда пакет не находится на пути поиска, может привести к library быстрее

system.time(require(ggplot2))
## Loading required package: ggplot2
##   user  system elapsed 
##   0.08    0.00    0.47 
detach(package:ggplot2)
system.time(library(ggplot2))
##   user  system elapsed 
##   0.06    0.01    0.08

Но если пакет уже загружен, то, как вы показываете, require работает быстрее, потому что он не делает больше, чем проверяет, загружен ли пакет.

Лучшим решением было бы создать небольшой пакет, который импортирует stringr (или, по крайней мере, str_extract из stringr