我正在扩展我最近在这里发布的一个问题(将图直接放入 Knitr 文档中(不将其文件保存在文件夹中))。
我正在编写一个 R 包,它为输出数据摘要的用户生成一个 .pdf 文件。我在包中有一个 .Rnw 脚本(在这里,我的 MWE 称为 test.Rnw)。用户可以:
1) knit("test.Rnw") to create a test.tex file
2) "pdflatex test.tex" to create the test.pdf summary output file.
.Rnw 文件生成许多图像。最初,这些都保存在当前目录中。这些图像被保存到目录中(或者可能是在 .tex 文件上调用 pdflatex 时创建的 .aux 或 .log 文件)看起来并不整洁(因为用户必须记住删除这些图像文件) . 其次,我还担心当脚本多次运行时,这种不整洁可能会导致问题。
因此,在我之前的帖子中,我们通过将图像保存到临时文件夹来改进 .Rnw 文件。有人告诉我,每次打开新的 R 会话时,临时文件夹中的文件都会被删除。但是,我仍然担心某些事情:
1)我觉得我可能需要插入一行,比如第 19 行:
system(sprintf("%s", paste0("rm -r ", temppath, "/*")))
每次运行 .Rnw 文件时自动删除临时文件夹中的文件(这样图像不仅会在每次 R 重新启动时被删除)。这将使当前目录中的图像保持干净,并且用户不必记住手动删除图像。但是,我不知道这个“解决方案”是否会通过 CRAN 标准来删除临时文件夹中的文件。原因是它会删除用户系统中的文件,如果其他程序正在将文件写入临时文件夹,这可能会导致问题。我觉得我已经阅读了关于 CRAN 不允许出于明显原因从用户计算机中写入/删除文件的信息。CRAN 对这种做法有多严格?有安全的方法吗?
2)如果在临时文件中写入和删除图像文件不起作用,还有什么方法可以达到相同的效果(运行脚本而不在文件夹中创建繁琐的图像文件)?是否可以将图像直接嵌入到输出文件中(不需要保存到任何目录)?我很确定这是不可能的。但是,有人告诉我可以使用 .Rmd 来执行此操作,并且可以将我的 .Rnw 转换为 .Rmd。这可能很困难,因为 .Rnw 文件必须遵循某些格式(文本和边距)才能正确输出,而且它很长。是否可以仅对生成图像的块使用 .Rmd 功能(将图像直接插入输出),而无需重写整个 .Rnw 文件?
下面是我的 MWE:
\documentclass[nohyper]{tufte-handout}
\usepackage{tabularx}
\usepackage{longtable}
\setcaptionfont{% changes caption font characteristics
\normalfont\footnotesize
\color{black}% <-- set color here
}
\begin{document}
<<setup, echo=FALSE>>=
library(knitr)
library(xtable)
library(ggplot2)
# Specify directory for figure output in a temporary directory
temppath <- tempdir()
# Erase all files in this temp directory first?
#system(sprintf("%s", paste0("rm -r ", temppath, "/*")))
opts_chunk$set(fig.path = temppath)
@
<<diamondData, echo=FALSE, fig.env = "marginfigure", out.width="0.95\\linewidth", fig.cap = "The diamond dataset has varibles depth and price.",fig.lp="mar:">>=
print(qplot(depth,price,data=diamonds))
@
<<echo=FALSE,results='asis'>>=
myDF <- data.frame(a = rnorm(1:10), b = letters[1:10])
print(xtable(myDF, caption= 'This data frame shows ten random variables from the distribution and a corresponding letter', label='tab:dataFrame'), floating = FALSE, tabular.environment = "longtable", include.rownames=FALSE)
@
Figure \ref{mar:diamondData} shows the diamonds data set, with the
variables price and depth.Table \ref{tab:dataFrame} shows letters a through j
corresponding to a random variable from a normal distribution.
\end{document}