Запустите Sweave или knitr с объектами из существующего сеанса R - PullRequest
8 голосов
/ 08 декабря 2011

Предположим, у меня есть объект x в моем текущем сеансе:

x <- 1

Как я могу использовать этот объект в документе Sweave или knitr, не назначая его явно:

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

Причина, по которой я спрашиваю, заключается в том, что я хочу написать скрипт R, который импортирует данные, а затем создает отчет по каждому предмету с использованием шаблона Sweave.

Ответы [ 4 ]

20 голосов
/ 09 декабря 2011

Я бы использовал немного другой подход к этому, поскольку использование глобальных переменных уменьшает 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))
7 голосов
/ 08 декабря 2011

Я думаю, что это просто работает.Если ваш файл Sweave называется «temp.Rnw», просто запустите

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

Вам нужно будет позаботиться о правильном присвоении имени полученному результату, чтобы каждый отчет не перезаписывался.

6 голосов
/ 09 декабря 2011

И Sweave, и knitr используют глобальную среду (см. globalenv()) при оценке фрагментов кода R, поэтому все, что в вашей глобальной среде может использоваться для вашего документа. (Строго говоря, knitr использует родительский фрейм parent.frame(), который в большинстве случаев равен globalenv())

0 голосов
/ 11 декабря 2011

Другой вариант, который я использовал в прошлом, - это чтобы файл Sweave открывал файл,

в моей сессии R

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

в моем простом документе

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

Очевидно, вы должны включить код, чтобы остановить, если файл не может быть найден.

...