如何在页面上查找 R 图形的字节大小?

How to find byte sizes of R figures on pages?

我想监控在各个页面上用 R 生成的图形的基本质量,例如每个页面的字节大小,... 我现在只能做平均页面的质量保证,请参阅下一章。 我认为必须有一些内建的任务而不是平均措施。

Rplots.pdf 中生成 4 页的代码,我想在此处的输出中知道每个页面的字节大小;也欢迎任何其他页面输出统计数据; 您可以通过 objects here 获得基本内存监控,但我希望它与 PDF

中的输出相对应
# https://stat.ethz.ch/R-manual/R-devel/library/graphics/html/plot.html
require(stats) # for lowess, rpois, rnorm
plot(cars)
lines(lowess(cars))

plot(sin, -pi, 2*pi) # see ?plot.function

## Discrete Distribution Plot:
plot(table(rpois(100, 5)), type = "h", col = "red", lwd = 10,
     main = "rpois(100, lambda = 5)")

## Simple quantiles/ECDF, see ecdf() {library(stats)} for a better one:
plot(x <- sort(rnorm(47)), type = "s", main = "plot(x, type = \"s\")")
points(x, cex = .5, col = "dark red")

## TODO summarise here the byte size of figures in the figures (1-4)
# Output: Rplot.pdf where 4 pages; I want to know the size of each page in bytes

我目前正在 command-line 中进行基本的质量保证,但想将其中一些移至 R,以便更快地观察错误。

预期输出:字节大小,例如 ls -l

的第 4 列

获取输出文档中单个页面的平均字节大小

限制

代码

filename <- "main.pdf"
filesize <- file.size(filename)
# http://unix.stackexchange.com/q/331175/16920
pages <- Rpoppler::PDF_info(filename)$Pages 

# print page size (= filesize / pages)
pagesize <- filesize / pages

## data of example file 
num 7350960
int 62
num 118564

输入:任何 62 页的文档
输出:平均单个页面大小 (118564)

测试答案

输出,但您不能轻易将输入更改为您想要的 PDF-file

     files                             size_bytes 
[1,] "./test_page_size_pdf/page01.pdf" "4,123,942"
[2,] "./test_page_size_pdf/page02.pdf" "    4,971"
[3,] "./test_page_size_pdf/page03.pdf" "    4,672"
[4,] "./test_page_size_pdf/page04.pdf" "    5,370"

输入:任意 64 页文档
预期输出:67(= 64 + 3)页,未分析 4

R: 3.3.2
OS:Debian 8.5

要测量 pdf 文件中每个页面的大小,我建议这样做:

test_size <- TRUE
pdf_name <- "masterpiece"

if(test_size){
  dir.create("test_page_size_pdf")
  pdf_address <- paste0("./test_page_size_pdf/page%02d.pdf")  
} else { pdf_address <- paste0("./", pdf_name, ".pdf")}

pdf(pdf_address, width=10, height=6, onefile=!test_size)
par(mar=c(1,1,1,1), oma=c(1,1,1,1))

  plot(rnorm(10^6, 100, 5), type="l")
  plot(sin, -pi, 2*pi) 
  plot(table(rpois(100, 5)), type = "h", col = "red", lwd = 10,
     main = "rpois(100, lambda = 5)")
  plot(x <- sort(rnorm(47)), type = "s", main = "plot(x, type = \"s\")")
  points(x, cex = .5, col = "dark red")

dev.off()

if(test_size){
  files <- paste0("./test_page_size_pdf/", list.files("./test_page_size_pdf/"))
  size_bytes <- format(file.size(files), big.mark = ",")
  file.remove(files)
  file.remove("test_page_size_pdf")
  cbind(files, size_bytes)
}

R 中 pdf 页面的大小取决于三件事:plot() 的内容、pdf() 函数中使用的选项以及此处定义的绘图选项 par()

这一切都难以估量。您还提到您希望在文件上也有类似于 shell 函数 ls 的东西,运行。因此,在此解决方案中,我创建了一个临时文件夹 dir.create(),我们将 pdf 的每一页单独保存在一个文件中。我们使用选项 onefile 来实现它。绘图完成后,每个 pdf 页面文件以及临时文件夹都将被删除。您可以在控制台中看到结果。

如果您完成了测试并希望将结果放在一个文件中,您只需更改此脚本第一行中的变量 test_size <- FALSE。顺便一提;我怀疑页面大小能否代表图像质量。 Pdf 是一种矢量格式,因此大小与元素数量相对应:请参阅我绘制 1mio 点的示例中第一页的大小。

如果您的系统上尚未安装 pdftk 实用程序,请下载并安装它,然后从 R 中尝试以下替代方法之一。

1) 它将 return 一个包含页面文件大小(以字节为单位)和其他信息的数据框。

myfile <- "Rplots.pdf"
system(paste("pdftk", myfile, "burst"))
file.info(Sys.glob("pg_*.pdf"))

它还会生成一个文件 doc_data.txt,其中包含一些您可能感兴趣也可能不感兴趣的杂项信息。

1a) 这个选项不会生成任何文件。它将简单地 return 页面的字符大小作为数字向量。

myfile <- "Rplots.pdf"
pages <- as.numeric(read.dcf(pipe(paste("pdftk", myfile, "dump_data")))[, "NumberOfPages"])
cmds <- sprintf("pdftk %s cat %d output - | wc -c", myfile, seq_len(pages))
unname(sapply(cmds, function(cmd) scan(pipe(cmd), quiet = TRUE)))

如果 pdftkwc 在您的路径上,以上应该有效。请注意,在 Windows 上,您可以在 Rtools 发行版中找到 wc,安装 Rtools 后通常位于 "C:\Rtools\bin\wc"

2) 这个替代方案类似于 (1) 但使用动画包:

library(animation)

ani.options(pdftk = "/path/to/pdftk")
pdftk("Rplots.pdf", "burst", "pg_%04d.pdf", "")
file.info(Sys.glob("pg_*.pdf"))