在非常频繁调用的函数中包含library
/ require
语句是否会产生任何不利影响?
使用的时间似乎相当可以忽略不计,但我每隔几分钟调用一次这个功能,我想知道重复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
答案 0 :(得分:12)
require
检查包是否已加载(在搜索路径上)
使用
loaded <- paste("package", package, sep = ":") %in% search()
并且只会在FALSE
library
包含类似的测试,但如果为真,则执行更多stuff
(包括创建可用包列表。
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导入stringr
(或至少str_extract