Запустите Sweave или knitr с объектами из существующего сеанса R
Предположим, у меня есть объект x
в моей текущей сессии:
x <- 1
Как я могу использовать этот объект в документе Sweave или knitr, не назначая его явно:
\documentclass{article}
\begin{document}
<<>>=
print(x)
@
\end{document}
Причина, по которой я спрашиваю, заключается в том, что я хочу написать скрипт R, который импортирует данные, а затем создает отчет по каждому предмету с использованием шаблона Sweave.
4 ответа
Я думаю, что это просто работает. Если ваш файл Sweave называется "temp.Rnw", просто запустите
> x <- 5
> Sweave("temp.Rnw")
Вам нужно будет позаботиться о правильном именовании полученного результата, чтобы каждый отчет не перезаписывался.
Я бы взял немного другой подход к этому, так как использование глобальных переменных уменьшает 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))
И Sweave и knitr
использует глобальную среду (см. globalenv()
) при оценке фрагментов кода R, поэтому все, что в вашей глобальной среде может быть использовано для вашего документа. (Строго говоря, knitr
использует родительский кадр parent.frame()
который globalenv()
в большинстве случаев)
Другой вариант, который я использовал в прошлом, - это чтобы файл Sweave открывал файл,
в моей R сессии
write.csv(x, "tabletoberead.csv")
в моем простом документе
<<label=label, echo=FALSE>>=
datatobeused<-read.csv("tabletoberead.csv")
...more manipulations on data ....
@
Очевидно, вы должны включить код, чтобы остановить, если файл не может быть найден.