8

假设x我当前会话中有一个对象:

x <- 1

如何在 Sweave 或 knitr 文档中使用此对象,而无需明确指定:

\documentclass{article}
\begin{document}
<<>>=
  print(x)
@
\end{document}

我问的原因是因为我想编写一个导入数据的 R 脚本,然后使用 Sweave 模板为每个主题生成报告。

4

4 回答 4

20

我会对此采取稍微不同的方法,因为使用全局变量会减少reproducibility分析。我使用brew+sweave/knitr来实现这一点。这是一个简单的例子。

# brew template: "template.brew"
\documentclass{article}
\begin{document}
<<>>=
print(<%= x %>)
@
\end{document}

# function to write report
write_report <- function(x){
  rnw_file <- sprintf('file_%s.rnw', x)
  brew::brew('template.brew', rnw_file)
  Sweave(rnw_file)
  tex_file <- sprintf('file_%s.tex', x) 
  tools::texi2pdf(tex_file, clean = TRUE, quiet = TRUE)
}

# produce reports
dat <- 1:10
plyr::l_ply(dat, function(x) write_report(x))
于 2011-12-08T21:15:30.973 回答
7

我认为它只是工作。如果您的 Sweave 文件名为“temp.Rnw”,只需运行

> x <- 5
> Sweave("temp.Rnw")

您必须担心正确命名结果输出,以免每个报告都被覆盖。

于 2011-12-08T16:42:44.387 回答
6

在评估 R 代码块时, Sweave 和knitr使用全局环境(请参阅参考资料globalenv()),因此全局环境中的任何内容都可以用于您的文档。(严格来说,使用大多数情况下的knitr父框架)parent.frame()globalenv()

于 2011-12-08T20:39:26.917 回答
0

我过去使用的另一个选项是让 Sweave 代码打开一个文件,

在我的 R 会话中

write.csv(x, "tabletoberead.csv")

在我的编织文件中

<<label=label, echo=FALSE>>= 
datatobeused<-read.csv("tabletoberead.csv")
...more manipulations on data ....
@ 

显然,如果找不到文件,您应该包含停止的代码。

于 2011-12-10T21:08:13.803 回答