Запустите Sweave или Knitr с объектами из существующего сеанса R.

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

x <- 1

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

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

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


person Sacha Epskamp    schedule 08.12.2011    source источник


Ответы (4)


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

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

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

person Aaron left Stack Overflow    schedule 08.12.2011
comment
Извините, а как это связано с моим вопросом? - person Sacha Epskamp; 08.12.2011
comment
Вопрос не должен быть таким ясным, как я думал. Разве вы не хотите найти объекты в сеансе R и распечатать их все в документе Sweave? - person Aaron left Stack Overflow; 08.12.2011
comment
Я все еще не уверен, что вы ищете, но я попробую еще раз. - person Aaron left Stack Overflow; 08.12.2011
comment
Да я и сам только что это понял. Я всегда компилирую через командную строку и почему-то думал, что это не работает, спасибо. - person Sacha Epskamp; 08.12.2011
comment
Связанный с этим вопрос заключается в том, как предотвратить использование Knitr/Sweave переменных в текущей среде. У меня может быть x в оперативной памяти сейчас, но позже я очищаю свою среду, и вдруг мой .Rnw или .Rmd не будет компилироваться, потому что я забыл определить в нем x, будучи уверенным в отсутствии каких-либо ошибок при компиляции. - person Maxim.K; 24.09.2014

Я бы выбрал несколько иной подход к этому, поскольку использование глобальных переменных уменьшает 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))
person Ramnath    schedule 08.12.2011
comment
Точно. Очень хороший момент. Я также не рекомендую использовать глобальные переменные вне документа. - person Yihui Xie; 10.12.2011

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

person Yihui Xie    schedule 08.12.2011
comment
У меня странная проблема, похожая на описанную выше, но knitr не распознает объекты, созданные в модуле R, который я загружаю через read_chunk(). В частности, он не находит объекты, которые я пытаюсь использовать в строке. Что это может означать? Делал всевозможные тесты, перезапускал окружение и т.д., но безрезультатно. Любой совет? P.S. Я даже пытался присвоить объект переменной конкретно в .GlobalEnv. (Кросс-пост из моего комментария к другому вопросу SO.) - person Aleksandr Blekh; 21.11.2014

Другой вариант, который я использовал в прошлом, — открыть файл с помощью кода Sweave.

в моем сеансе R

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

в моем ткацком документе

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

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

person PaulHurleyuk    schedule 10.12.2011