假设我当前会话中有一个对象x
:
x <- 1
如何在Sweave或knitr文档中使用此对象,而无需明确指定:
\documentclass{article}
\begin{document}
<<>>=
print(x)
@
\end{document}
我问的原因是因为我想编写一个R脚本来导入数据,然后使用Sweave模板为每个主题生成一个报告。
答案 0 :(得分: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))
答案 1 :(得分:7)
我认为它确实有效。如果您的Sweave文件名为“temp.Rnw”,请运行
> x <- 5
> Sweave("temp.Rnw")
您必须担心正确命名结果输出,以免每个报告被覆盖。
答案 2 :(得分:6)
Sweave和knitr
在评估R代码块时都使用了全局环境(请参阅globalenv()
),因此您的全局环境中的任何内容都可以用于您的文档。 (严格来说,knitr
使用父框架parent.frame()
,在大多数情况下globalenv()
答案 3 :(得分:0)
我过去使用的另一个选项是让Sweave代码打开一个文件,
在我的R会议中
write.csv(x, "tabletoberead.csv")
在我的sweave文件中
<<label=label, echo=FALSE>>=
datatobeused<-read.csv("tabletoberead.csv")
...more manipulations on data ....
@
显然,如果找不到该文件,您应该包含停止的代码。