这一定是一个简单的问题,但我不知道该如何解决。
我想使用 Sweave 生成一份 PDF 报告。实际上,还有很多很多报告。
我缩短并简化了 sweave 代码以直奔主题。以下是代码 (short.rnw):
\documentclass[a4paper,11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[OT1]{fontenc}
\usepackage{graphicx}
\usepackage{Sweave}
\begin{document}
\section*{MySection}
\begin{figure}[htbp]
\caption*{MyCaption}
<<echo=FALSE,results=tex>>=
file=paste(getwd(),"fig","boxp.png",sep="/")
cat("\\includegraphics[width=0.5\\textwidth]{",file,"}",sep="")
@
\end{figure}
\end{document}
如您所见,此代码只是在报告中包含了一个名为“boxp.png”的图形。实际上我不需要 sweave 来执行此操作,但我真正想要做的是生成具有不同文件名的多个报告。
那么,有没有办法传递字符串参数(或任何类型的参数)来构建报告,而不必每次都重写 sweave 模板?
我使用命令“R CMD Sweave short.rnw”从 bash 脚本生成报告,字符串参数在此调用之前定义。
编辑 :
#!/bin/bash
for f in ${files}
do
prog1 f
# prog1 is a program which generates figures in a directory dir
# this directory has a name depending on f name
# for instance if f="foo.txt", then dir="./foo_dir"
###
#And now HERE I have to create my report with the images
#in foo_dir
# And I don't know how I can specify the varying names of dir
# in my template...
done
谢谢。
托尼
答案1
有两种方法可以实现您的目标。一种是使用 sweave,另一种是使用名为 brew 的 R 包,它克服了 sweave 循环全局变量的限制。我提供了这两个代码块。
Sweave 代码块
\begin{document}
<<echo = F, results = tex>>=
figdir = paste(getwd(), 'fig', sep = '/')
fignames = read.csv('fignames.csv');
for (i in seq_along(fignames)) {
filename = file.path(figdir, i)
cat("\\pagebreak");
cat("\\section{", i, "}", sep = "");
cat("\\begin{figure}[htbp]");
cat("\\caption*{MyCaption", i, "}", sep = "");
cat("\\includegraphics[width = 0.5\\textwidth]{", filename, "}", sep = "");
cat("\\end{figure}");
}
@
\end{document}
Brew 代码块
\begin{document}
<% figdir = paste(getwd(), 'fig', sep = '/') %>
<% fignames = read.csv('fignames.csv');
<% for (i in seq_along(fignames)) { -%>
\pagebreak
<% filename = file.path(figdir, i) %>
<%= cat("\section{", i, "}", sep = "") %>
\begin{figure}[htbp]
\caption*{MyCaption}
<%= cat("\\includegraphics[width = 0.5\\textwidth]{filename}")
\end{figure}
<% } -%>
\end{document}
你可以查看链接酿造关于如何在 R 中使用它
编辑:这将生成一个包含所有输出的单个文件。
答案2
我遇到了类似的问题,我想将 R 会话中的变量“推送”到 sweave 文档中(请参阅https://stackoverflow.com/questions/2912270/sweave-cant-see-a-vector-if-run-from-a-function)。
Rscript sweavescript.R f
似乎当 Sweave 运行时,它可以看到全局环境中的对象。因此,您可以从 bash 脚本中调用 R,并将 'f' 的值传递给脚本(请参阅https://stackoverflow.com/questions/3433603/parsing-command-line-arguments-in-r-scripts)。然后脚本会将“f”的值放入全局环境中
f<<-commandArgs(trailingOnly = T)
然后运行 sweave,其中您的 sweave 模板使用 f 的值来生成图像。
希望这能帮助你入门。