Какое влияние требуется на пакет внутри функции, если пакет уже загружен?
Есть ли какой-либо неблагоприятный эффект для включения операторов 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