向 Sweave 文档提供字符串参数

向 Sweave 文档提供字符串参数

这一定是一个简单的问题,但我不知道该如何解决。

我想使用 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 的值来生成图像。

希望这能帮助你入门。

相关内容