如果包已经加载,那么在函数内部需要包的影响是什么?

时间:2013-03-06 21:26:37

标签: r require

在非常频繁调用的函数中包含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

1 个答案:

答案 0 :(得分:12)

require检查包是否已加载(在搜索路径上)

使用

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

并且只会在FALSE

的情况下继续加载

library包含类似的测试,但如果为真,则执行更多stuff(包括创建可用包列表。

require继续使用tryCatch调用库并创建消息。

当一个包不在搜索路径上时,对libraryrequire的一次调用可能会导致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

的小包