【问题标题】:Run Sweave or knitr with objects from existing R session使用现有 R 会话中的对象运行 Sweave 或 knitr
【发布时间】:2012-01-16 02:08:20
【问题描述】:

假设我在当前会话中有一个对象x

x <- 1

如何在 Sweave 或 knitr 文档中使用此对象,而无需明确指定:

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

我问的原因是因为我想编写一个导入数据的 R 脚本,然后使用 Sweave 模板为每个主题生成报告。

【问题讨论】:

    标签: r sweave knitr


    【解决方案1】:

    在评估 R 代码块时,Sweave 和 knitr 都使用全局环境(请参阅 globalenv()),因此全局环境中的任何内容都可以用于您的文档。 (严格来说,knitr 使用父框架parent.frame(),大多数情况下是globalenv()

    【讨论】:

    • 我遇到了一个奇怪的问题,与上述类似,但knitr 无法识别在R 模块中创建的对象,我通过read_chunk() 加载该模块。特别是,它没有找到我试图内联使用的对象。这意味着什么?我做了各种测试,重新启动环境等,但无济于事。有什么建议吗?附言我什至尝试将对象分配给专门在.GlobalEnv 中的变量。 (从我的评论交叉发布到另一个 SO 问题。)
    【解决方案2】:

    我过去使用的另一个选项是让 Sweave 代码打开一个文件,

    在我的 R 会话中

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

    在我的 sweave 文件中

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

    显然,如果找不到文件,您应该包含停止代码。

    【讨论】:

      【解决方案3】:

      我会对此采取稍微不同的方法,因为使用全局变量会减少分析的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))
      

      【讨论】:

      • 没错。很好的一点。我也不建议在文档之外使用全局变量。
      【解决方案4】:

      我认为它只是工作。如果您的 Sweave 文件名为“temp.Rnw”,只需运行

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

      您必须担心正确命名结果输出,以免覆盖每个报告。

      【讨论】:

      • 抱歉,这与我的问题有什么关系?
      • 问题一定没有我想的那么清楚。您不想在 R 会话中找到对象并将它们全部打印到 Sweave 文档中吗?
      • 我仍然不确定您在寻找什么,但我会再试一次。
      • 是的,我自己也意识到了这一点。我总是通过命令行编译,由于某种原因认为这不起作用,谢谢。
      • 一个相关的问题是如何防止 knitr/Sweave 在当前环境中使用变量。我现在可能在 RAM 中有 x,但后来我清除了我的环境,突然我的 .Rnw 或 .Rmd 无法编译,因为我忘记在其中定义 x,确保没有任何编译错误。
      猜你喜欢
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多