我想在各个页面上监控R中生成的数字的基本质量,例如每页的字节大小,...... 我现在只能对普通页面进行质量保证,请参阅以下章节。 我认为必须为平均措施建立一些内容。
在Rplots.pdf
生成4页的代码,我想知道输出中每页的字节大小;任何其他页面输出的统计数据也是受欢迎的;
您可以通过对象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
我目前正在命令行中进行基本的质量保证,但是想将其中的一部分移动到R,以便更快地观察错误。
预期输出:字节大小,例如ls -l
限制
代码
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文件
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
操作系统:Debian 8.5
答案 0 :(得分:4)
下载并安装pdftk实用程序(如果它尚未在您的系统上),然后从R中尝试以下其中一种替代方法。
1)它将返回一个数据框,其中包含页面文件大小(以字节为单位)和其他信息。
myfile <- "Rplots.pdf"
system(paste("pdftk", myfile, "burst"))
file.info(Sys.glob("pg_*.pdf"))
它还会生成一个文件doc_data.txt,其中包含一些可能或可能不感兴趣的杂项信息。
1a)此替代方案不会生成任何文件。它只会将页面的字符大小作为数字向量返回。
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)))
如果pdftk
和wc
在您的路径上,则上述情况应该有效。请注意,在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"))
答案 1 :(得分:2)
要测量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()
函数中使用的选项以及{{1}中定义的绘图选项}}。
这一切都很难估计。你还提到你喜欢有类似于shell函数par()
的东西,它也运行在文件上。因此,在此解决方案中,我创建了一个临时文件夹ls
,其中我们将pdf的每个页面分别保存在一个文件中。我们使用选项dir.create()
实现此功能。绘图完成后,每个pdf页面文件以及临时文件夹都将被删除。你可以在控制台中看到结果。
如果您已完成测试并希望将结果放在单个文件中,则只需在此脚本的第一行中更改变量onefile
。顺便说说;我有点怀疑页面的大小是图像质量的代理。 Pdf是一种矢量格式,因此大小与元素数量相对应:请参阅我的示例中第一页的大小,其中我绘制了1mio点。