officer - 与记者相比,官员似乎很慢
问题描述
我有一些使用 ReporteR 运行良好的脚本,并正在尝试更新它们以使用官员。我的脚本非常重复,因为我只需要多次输出几乎相同的东西,有时只是改变字体。转换后,我发现脚本太慢了,我将无法使用它们。这些脚本在 ReporteRs 中运行几分钟,但在官员中需要一段时间。
为什么这是5000次在官:
body_add_par(文档,“”)
比 ReporteRs 中的等价物慢得多:
doc <- addParagraph(doc, '')
非常感谢
代码(所有向量都有 2000 多个元素):
outputFile <- paste0(OutputDir, "test.docx")
#SET STYLES
norm <- fp_text(color = "black", font.size = 10, bold = FALSE, italic = FALSE,
underlined = FALSE, font.family = "Arial", vertical.align = "baseline",
shading.color = "transparent")
norm_red <- fp_text(color = "red", font.size = 10, bold = FALSE, italic = FALSE,
underlined = FALSE, font.family = "Arial", vertical.align = "baseline",
shading.color = "transparent")
norm_blue <- fp_text(color = "blue", font.size = 10, bold = FALSE, italic = FALSE,
underlined = FALSE, font.family = "Arial", vertical.align = "baseline",
shading.color = "transparent")
norm_green <- fp_text(color = "green", font.size = 10, bold = FALSE, italic = FALSE,
underlined = FALSE, font.family = "Arial", vertical.align = "baseline",
shading.color = "transparent")
bold <- fp_text(color = "black", font.size = 10, bold = TRUE, italic = FALSE,
underlined = FALSE, font.family = "Arial", vertical.align = "baseline",
shading.color = "transparent")
bold_red <- fp_text(color = "red", font.size = 10, bold = TRUE, italic = FALSE,
underlined = FALSE, font.family = "Arial", vertical.align = "baseline",
shading.color = "transparent")
bold_blue <- fp_text(color = "blue", font.size = 10, bold = TRUE, italic = FALSE,
underlined = FALSE, font.family = "Arial", vertical.align = "baseline",
shading.color = "transparent")
bold_green <- fp_text(color = "green", font.size = 10, bold = TRUE, italic = FALSE,
underlined = FALSE, font.family = "Arial", vertical.align = "baseline",
shading.color = "transparent")
doc <- read_docx()
#ADD TITLE
fpar_ <- fpar(ftext("ASSIGNMENTS", prop = bold))
doc <- body_add_fpar(doc, fpar_, style = "centered", pos = "on")
doc <- body_add_par(doc, "", style = NULL, pos = "after")
#ADD DATE, DIRECTORY
fpar_ <- fpar(ftext("DATE: ", prop = bold),
ftext(date(), prop = norm))
doc <- body_add_fpar(doc, fpar_, style = "Normal", pos = "after")
fpar_ <- fpar(ftext("DIRECTORY: ", prop = bold),
ftext(Dir, prop = norm))
doc <- body_add_fpar(doc, fpar_, style = "Normal", pos = "after")
doc <- body_add_par(doc, "", style = NULL, pos = "after")
#Get all
all <- as.character(Summary$Name)
for (i in 1:length(all)) {
res <- as.numeric(Types[Types$Num==all[i], "Code"])
if (5 %in% res | 12 %in% res) {
#Green
fpar_ <- fpar(ftext(all[i], prop = bold_green))
} else if (7 %in% res) {
#Red
fpar_ <- fpar(ftext(all[i], prop = bold_red))
} else if (8 %in% res) {
#Blue
fpar_ <- fpar(ftext(all[i], prop = bold_blue))
} else {
fpar_ <- fpar(ftext(all[i], prop = bold))
}
doc <- body_add_fpar(doc, fpar_, style = "Normal", pos = "after")
#Get list of files
res <- unique(Detail[Detail$Num==all[i], c("Name", "Cat")])
#OUTPUT FILE NAME AND CAT
if (nrow(res) == 0) {
#NO FILE FOUND
} else {
for (j in 1:nrow(res)) {
fpar_ <- fpar(ftext(paste(as.character(res[j, "Name"]), " "), prop = bold),
ftext(as.character(res[j, "Cat"]), prop = norm))
doc <- body_add_fpar(doc, fpar_, style = "Normal", pos = "after")
}
}
doc <- body_add_par(doc, "", style = NULL, pos = "after")
}
print(doc, target = outputFile)
解决方案
这是与一些可重现的代码的比较:
library(officer)
library(ReporteRs)
library(microbenchmark)
docx()# first run can be slow because of java init. operations
mb <- microbenchmark::microbenchmark(
officer = {
doc <- read_docx()
for(i in 1:100){
doc <- body_add_par(doc, "")
}
},
ReporteRs = {
doc <- docx()
for(i in 1:100){
doc <- addParagraph(doc, '')
}
} )
结果如下 - 军官是赢家:
> mb
Unit: milliseconds
expr min lq mean median uq max neval
officer 224.3742 232.9602 238.8452 237.5110 241.5320 325.4288 100
ReporteRs 311.7194 337.9194 349.7107 343.9703 353.8814 447.2623 100
这是我的sessionInfo()
结果:
> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6
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] fr_FR.UTF-8/fr_FR.UTF-8/fr_FR.UTF-8/C/fr_FR.UTF-8/fr_FR.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] microbenchmark_1.4-4 ReporteRs_0.8.10 ReporteRsjars_0.0.4 officer_0.3.2
loaded via a namespace (and not attached):
[1] Rcpp_0.12.17 knitr_1.20 xml2_1.2.0 magrittr_1.5 uuid_0.1-2 xtable_1.8-2
[7] R6_2.2.2 tools_3.5.1 rvg_0.1.9.001 R.oo_1.22.0 png_0.1-7 htmltools_0.3.6
[13] yaml_2.1.19 digest_0.6.15 zip_1.0.0 rJava_0.9-10 shiny_1.1.0 later_0.7.3
[19] base64enc_0.1-3 R.utils_2.6.0 promises_1.0.1 mime_0.5 compiler_3.5.1 gdtools_0.1.7
[25] R.methodsS3_1.7.1 httpuv_1.4.4.2
推荐阅读
- python - 如何在 OpenCV 中从 Alpha 通道创建遮罩?
- apache-kafka - 如何使用 nodejs 或 java 在 Kafka 流生产者中创建大消息块(1MB 以上)?
- ios - 如何使用 iOS 13 在 iPhone 上启动场景的多个实例?
- java - 使用 mockito 更改 Final 字段
- php - 当 $_SERVER['QUERY_STRING'] 包含 'a=foo' 时,为什么不会填充 $_GET['a']?
- iframe - Mendix iFrame - 找不到页面
- java - 从 Java 中的未知 Groovy 类访问字段
- python - 如何在django models.py中查询相关模型
- vue.js - Vue.js 中 v-if/else 高度的平滑过渡
- amazon-web-services - 使用 AWS SQS 作为 Aurora 数据库的写入队列来提高系统性能是否有效