在 R pdf 输出中抑制或设置 CreationDate/ModDate
Posted
技术标签:
【中文标题】在 R pdf 输出中抑制或设置 CreationDate/ModDate【英文标题】:Suppressing or setting CreationDate/ModDate in R pdf output 【发布时间】:2010-10-22 17:54:06 【问题描述】:当 R 使用 pdf() 创建 PDF 时,它在 PDF 中包含 CreationDate 和 ModDate。我在 svn 存储库中有许多这样生成的 PDF,其效果是,当 R 重新制作图形时,即使使用相同的数据,它们也会显示为 svn 的修改(正确地)。让两个人一起玩得很好的最好方法是什么?
我可以简单地从 R 之外的 PDF 中删除这些行,但是这个额外的步骤是不可取的。 作为运行脚本的一部分,我可以将系统时间设置为某个固定值,但这更不可取。 我什至可以说服 svn 使用专门的 diff 来忽略这些行的变化,但这听起来比它的价值更麻烦。
如果有一种方法可以防止 R 将这些行放在 PDF 文件中,那么一个非常令人愉快的解决方案是。我有一个文件系统可以告诉我何时创建和修改了文件,非常感谢,我也不需要将这些信息存储在文件中。
【问题讨论】:
【参考方案1】:我同意 Tal,生成的文件不应该在版本控制中。
关于您最初的问题,我认为答案是否定的,您不能阻止 R 这样做。我发现在 R pdf 帮助文件中没有提到这些选项,http://www.r-cookbook.com/rhelp/pdf.html
如果您查看 R 内部的 pdf 函数(只需执行 'pdf' 而不带任何括号以打印代码),它实际上会创建 pdf 文件并调用:
.External(PDF, file, old$paper, old$family, old$encoding, old$bg, old$fg,
old$width, old$height, old$pointsize, onefile, old$pagecentre, old$title,
old$fonts, version[1L], version[2L], old$colormodel, old$useDingbats,
old$useKerning)
没有提及您正在寻找的选项,因此您可能不走运。除非您想追踪 R 用于生成 PDF 并对其进行更改的代码。
【讨论】:
【参考方案2】:虽然这实际上并不能回答您的问题,但通常最好从源代码管理中排除自动生成的文件,正是出于这个原因。
【讨论】:
我不太同意。例如,在优化某些算法时,您要确保优化不会改变输出(可能在您的其他工作中使用)。将输出置于版本控制之下是一种测试方式,即使可能不是最好的方式。 我也不同意 Tal。是的,在您的 R 代码存储库中,您可能不想包含 pdf 文件,因为它们被视为“输出”。但是在您的 TeX 存储库中,您将 pdf 文件作为输入包含在内,您绝对希望它们处于源代码控制之下。毕竟,当您将论文发送给出版商时,您并没有包含您的 R 代码和数据以供他们生成图表,对吗?【参考方案3】:这既不优雅,也不可取。很多事情都可能出错或被利用。但它对我有用。
我只是用pdf_on
代替pdf
,用pdf_off
代替dev.off
。
pdf_on <- function(...)
field <- "(\\s*/(Creation|Mod)Date)"
value <- "\\(D:[0-9]14(.[0-9]2.[0-9]2.?)?\\)"
from <- paste0("^", field, " ", value, "$")
to <- "\\1 (D:19700101000000)"
file <- list(...)[[1]]
pdf_cmd <<- paste0("sed -E 's_", from, "_", to, "_' -i ", file)
return(pdf(...))
pdf_off <- function(...)
ret <- dev.off(...)
Sys.sleep(0.1)
system(pdf_cmd)
return(ret)
【讨论】:
以上是关于在 R pdf 输出中抑制或设置 CreationDate/ModDate的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化箱图(boxplot)自定义设置抑制箱图中异常值数据点的输出(removes boxplot outliers in the ggplot2 graph)
如何在 R studio 的 Caret 中抑制 Boosted 树模型 gbm 的迭代输出