代码之家  ›  专栏  ›  技术社区  ›  Marta Karas

在RStudio中安装R包时,如何抑制更新加载包窗口?

r
  •  0
  • Marta Karas  · 技术社区  · 6 年前

    如何禁用/抑制“更新已加载的包”弹出窗口,该窗口在 R install.packages() 阿格斯和我做了谷歌搜索,但没有发现)。

    背景:我的目标是比较一个大的(2k)包集合的安装时间。我想让它在一个循环中过夜,在每个迭代中:(1)除 base 优先包,(2)我衡量特定包安装的时间。我必须没有弹出窗口(停止进程)这样做。

    sessionInfo

    > sessionInfo()
    R version 3.5.1 (2018-07-02)
    Platform: x86_64-apple-darwin15.6.0 (64-bit)
    Running under: macOS  10.14
    
    Matrix products: default
    BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
    LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
    
    locale:
    [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    loaded via a namespace (and not attached):
    [1] compiler_3.5.1 tools_3.5.1   
    > 
    

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   hrbrmstr    6 年前

    您应该考虑一个基准管理工具,类似于:

    #!/bin/bash
    
    # Create file of all installed packages
    
    Rscript -e 'writeLines(unname(installed.packages()[,1]), "installed-pkgs.txt")'
    
    # Iterate over the file, benchmarking package load 3x (consider bumping this up)
    
    while read -r pkg; do
    
      echo -n "Benchmarking package [${pkg}]"
    
      for iter in {1..3}; do
    
        echo -n "."
    
        Rscript --vanilla \
          -e 'args <- commandArgs(TRUE)' \
          -e 'invisible(suppressPackageStartupMessages(xdf <- as.data.frame(as.list(system.time(library(args[1], character.only=TRUE), FALSE)))))' \
          -e 'xdf$pkg <- args[1]' \
          -e 'xdf$iter <- args[2]' \
          -e 'xdf$loaded_namespaces <- I(list(loadedNamespaces()))' \
          -e 'saveRDS(xdf, file.path("data", sprintf("%s-%s.rds", args[1], args[2])))' \
          "${pkg}" \
          "${iter}"
    
      done
    
      echo ""
    
    done <installed-pkgs.txt
    

    我做了一个 ~/projects/pkgbench 带有 data . 有了它你:

    • 每次迭代3次(如果需要,可以提高)
    • 每次迭代一个RDS文件

    当它运行(从macOS盒上的非RStudio终端会话)时,您将获得进度(每次迭代一个点):

    $ ./pkgbench.sh
    Benchmarking package [abind]...
    Benchmarking package [acepack]...
    Benchmarking package [AER]...
    Benchmarking package [akima]...
    

    然后您可以执行以下操作(我在几个pkg之后就终止了基准测试):

    library(hrbrthemes) # github/gitlab
    library(tidyverse)
    
    map_df(
      list.files("~/projects/pkgbench/data", full.names = TRUE),
      readRDS
    ) %>% tbl_df() %>% print() -> bench_df
    ## # A tibble: 141 x 8
    ##    user.self sys.self elapsed user.child sys.child pkg     iter  loaded_namespaces
    ##        <dbl>    <dbl>   <dbl>      <dbl>     <dbl> <chr>   <chr> <list>           
    ##  1   0.00500 0.00100  0.00700         0.        0. abind   1     <chr [9]>        
    ##  2   0.00600 0.00100  0.00700         0.        0. abind   2     <chr [9]>        
    ##  3   0.00600 0.00100  0.00600         0.        0. abind   3     <chr [9]>        
    ##  4   0.00500 0.00100  0.00600         0.        0. acepack 1     <chr [9]>        
    ##  5   0.00600 0.001000 0.00800         0.        0. acepack 2     <chr [9]>        
    ##  6   0.00500 0.00100  0.00600         0.        0. acepack 3     <chr [9]>        
    ##  7   1.11    0.0770   1.19            0.        0. AER     1     <chr [36]>       
    ##  8   1.04    0.0670   1.11            0.        0. AER     2     <chr [36]>       
    ##  9   1.07    0.0720   1.15            0.        0. AER     3     <chr [36]>       
    ## 10   0.136   0.0110   0.147           0.        0. akima   1     <chr [12]>       
    ## # ... with 131 more rows
    
    group_by(bench_df, pkg) %>% 
      summarise(
        med_elapsed = median(elapsed), 
        ns_ct = length(loaded_namespaces[[1]])
      ) -> bench_sum
    
    ggplot(bench_sum, aes("elapsed", med_elapsed)) +
      geom_violin(fill = ft_cols$gray) +
      ggbeeswarm::geom_quasirandom(color = ft_cols$yellow) +
      geom_boxplot(color = "white", fill="#00000000", outlier.colour = NA) +
      theme_ft_rc(grid="Y")
    

    enter image description here

    ggplot(bench_sum, aes(ns_ct, med_elapsed)) +
      geom_point(color = ft_cols$yellow) +
      geom_smooth(color = ft_cols$peach) + # shld prbly use something better than loess
      theme_ft_rc(grid = "XY")
    

    enter image description here

    如果你打算在一夜之间运行它,那么一定要禁用macOS可能对你做的所有“睡眠/空闲”时间的事情(比如禁用任何重量级屏幕保护程序,防止它将磁盘置于睡眠状态等等)。

    capture.output() 或者做一个有和没有的比较。

    library() 还有所有这些参数选项:

    library(
      package, 
      help, 
      pos = 2, 
      lib.loc = NULL,
      character.only = FALSE, 
      logical.return = FALSE,
      warn.conflicts = TRUE, 
      quietly = FALSE,
      verbose = getOption("verbose")
    )
    

    我也只看了中位数 价值观。考虑检查所有 system.time 数据框中的值。

    如果你的Mac电脑足够强大的CPU内核,而且你有一个快速的固态磁盘,你就可以 能够 考虑使用GNU parallel