15

非常に頻繁に呼び出される関数内に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
4

1 に答える 1

12

requireパッケージが(検索パス上に)すでにロードされているかどうかを確認します

使用して

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

ロードを続行するのは、これがFALSE

library同様のテストが含まれていますが、これが TRUE の場合はもう少し多くのことを行いstuffます (利用可能なパッケージのリストの作成を含む.

requiretryCatch ライブラリへの呼び出しを使用して続行し、メッセージを作成します。

そのため、パッケージが検索パス上にない場合、libraryまたはを 1 回呼び出すと、より高速になる可能性があります。requirelibrary

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_extractstringr から

于 2013-03-06T22:06:44.457 に答える