【发布时间】:2019-11-27 22:37:17
【问题描述】:
我正在使用 testthat 测试一个 R 包。为 S3 方法 plot.foo 编写测试是一件非常头疼的事情,因为它只返回 NULL,所以我决定将绘图保存到文件中并检查自上次运行以来它是否已更改。
pdf(file='plot_foo.pdf')
plot.foo(bar)
dev.off()
tools::md5sum('plot_foo.pdf')
问题是每次我使用相同的输入得到不同的结果。不过,输出看起来是一样的。
replicate(10, {
pdf(file='plot.pdf')
plot(1:10, 10:1)
dev.off()
Sys.sleep(1)
tools::md5sum('plot.pdf')
})
请注意,您需要在每次迭代之间等待一段时间,否则文件将是相同的,这让我怀疑某些基于时间的元数据已更改。
plot.pdf plot.pdf
"5a0c096fe088342bc3c3d5960c5da1c9" "40d93c26b4901aef55a32b75473d05d2"
plot.pdf plot.pdf
"9815c6d9b2e94cda763a486fcd2ddf08" "a8e8db82d06b79f98416fa034b5aee46"
plot.pdf plot.pdf
"c2770250dbef3b60706559114c434851" "91c8cf124eb61ddebd3edbbb2d01677f"
plot.pdf plot.pdf
"d1594bd83b97fc890410a4c305366682" "f05197f165ec04df3dac4664494f4617"
plot.pdf plot.pdf
"64427124c6a6454e8f0e5944de20be95" "ff1abf2b31dfe688cf8f5994e409cc6d"
如何强制 R 生成一致的 PDF?我暂时切换到 PostScript 进行测试,但我更喜欢 PDF,因为它的支持更好(Windows 似乎没有内置 PostScript 查看器),因此也可以用作文档。
【问题讨论】:
-
您是否尝试过查看不同 PDF 之间的差异以了解发生了什么变化?
-
我认为 PDF 通常在其中包含
CreatedDate元数据。在我最近生成的一个文件上,我做了pdftk myfile.pdf dump_data并看到它有一个时间戳。我怀疑使用校验和总是会对像这样可以忽略不计的差异敏感。 -
是的,我刚刚做了一些检查(使用此方法:superuser.com/questions/125376/…),看起来每个文件中有 1 或 2 个时间戳最终不同,并且没有明显的方法可以禁用时间戳在
pdf(). -
为了测试,您可以将绘图保存为 PNG 文件(或将 PDF 转换为 PNG)。
-
查看
vdiffr。根据其描述:“视觉回归测试和图形差异:'testthat' 包的扩展,可以轻松添加图形单元测试。它提供了一个闪亮的应用程序来管理测试用例。”
标签: r pdf plot graphics metadata