如何在页面上查找 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 列
获取输出文档中单个页面的平均字节大小
限制
- 页面数据同质性的要求。此方法仅适用于所有页面都来自同一示例的情况。
否则就很麻烦,因为它只是平均,而不是描述当时的个别现象。
其他可能的弱点
- PDF-elements 和元数据。将 PDF-file 视为一个整体,而不是关注图形 objects 本身。所以这限制了绝对值的使用,因为文件大小还包含 headers 和其他与图形无关的元数据 objects.
代码
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)))
如果 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"))
我想监控在各个页面上用 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
获取输出文档中单个页面的平均字节大小
限制
- 页面数据同质性的要求。此方法仅适用于所有页面都来自同一示例的情况。 否则就很麻烦,因为它只是平均,而不是描述当时的个别现象。 其他可能的弱点
- PDF-elements 和元数据。将 PDF-file 视为一个整体,而不是关注图形 objects 本身。所以这限制了绝对值的使用,因为文件大小还包含 headers 和其他与图形无关的元数据 objects.
代码
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)))
如果 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"))