Run Sweave or knitr with objects from existing R session

前端 未结 4 1659
伪装坚强ぢ
伪装坚强ぢ 2020-12-01 04:59

Suppose I have an object x in my current session:

x <- 1

How can I use this object in an Sweave or knitr document, without

相关标签:
4条回答
  • 2020-12-01 05:26

    I would take a slightly different approach to this, since using global variables reduces the reproducibility of the analysis. I use brew + sweave/knitr to achieve this. Here is a simple example.

    # 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))
    
    0 讨论(0)
  • 2020-12-01 05:37

    Both Sweave and knitr makes use of the global environment (see globalenv()) when evaluating R code chunks, so whatever in your global environment can be used for your document. (Strictly speaking, knitr uses the parent frame parent.frame() which is globalenv() in most cases)

    0 讨论(0)
  • 2020-12-01 05:39

    I think it just works. If your Sweave file is named "temp.Rnw", just run

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

    You'll have to worry about naming the resulting output properly so each report doesn't get overwritten.

    0 讨论(0)
  • 2020-12-01 05:39

    Another option I have used in the past is to have the Sweave code open a file,

    in my R session

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

    in my sweave document

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

    Obviously you should include code to stop if the file can't be found.

    0 讨论(0)
提交回复
热议问题