r - 如何在 RStudio 中安装 R 包期间抑制更新加载的包窗口?
问题描述
如何禁用/抑制在包安装过程中不断出现的弹出窗口“更新加载的包” R
?我很高兴将其设置为“否”,但我不知道如何使其工作(调查了install.packages()
args 并进行了谷歌搜索,但没有发现)。
背景:我的目标是比较大量(2k)包的安装时间。我想在一夜之间循环,在每次迭代中:(1)我删除除base
优先级包之外的所有包,(2)我测量特定包安装的时间。我必须没有弹出窗口(停止进程)来执行此操作。
sessionInfo
当我启动 RStudio 时:
> 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
>
解决方案
您应该考虑使用类似于以下内容的基准测试工具:
#!/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
并将 ^^ 放入~/projects/pkgbench
. 有了它,你:
- 每次运行都获得一个干净的(香草)R 会话
- 每个迭代 3 次(如果你愿意,可以让它更高)
- 每次迭代一个 RDS 文件
- RDS 文件中后加载会话命名空间中的包数(包括名称)
当它运行时(从 macOS 机器上的非 RStudio 终端会话),您会获得进度(每次迭代一个点):
$ ./pkgbench.sh
Benchmarking package [abind]...
Benchmarking package [acepack]...
Benchmarking package [AER]...
Benchmarking package [akima]...
然后你可以做类似的事情(我在几个 pkgs 之后就终止了基准测试):
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")
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")
如果您要在一夜之间运行它,请确保禁用 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 核心方面足够强大并且你有一个快速的固态磁盘,你可以考虑使用带有这个工具的 GNUparallel
来加快时间。如果你这样做并且对并发并行运行的数量相当保守,我肯定会在每个 pkg 使用超过 3 次迭代。
推荐阅读
- javascript - UnhandledPromiseRejectionWarning:错误:协议错误(Runtime.callFunctionOn):目标已关闭。(木偶师)
- python - 在给定条件的情况下填充 numpy 数组中的值
- ruby - 如何模拟sidekiq中的“立即重试”按钮
- python - pyLDAvis:“ValuesView”类型的对象不是 JSON 可序列化的
- c - MIPS GCC 交叉编译器构建失败:“找不到 -lc”
- linux - 每天使用 logrotate 擦除干净的日志文件
- three.js - 是否在内部使用 .matrixWorld?
- json - 无法使用 powershell 更新 json 文件
- c# - 在 c#.net 中将对象序列化为 XmlDocument 后,getelementById 返回 null
- react-native - 命令 npm 运行弹出显示错误弹出失败,退出代码为 1