【问题标题】:Is there a way to push an R script file into a sweave document (opposite of tangle)有没有办法将 R 脚本文件推送到 sweave 文档中(与缠结相反)
【发布时间】:2011-11-08 22:10:10
【问题描述】:

我经常创建特定的 sweave 文件来进行分析和生成 pdf 文档,但是,有时我想获取现有的 R 脚本文件并运行它,同时生成命令和输出的 pdf。我知道有一个 tangle 命令可以将 R 命令从 rnw sweave 文件中提取出来以创建 R 脚本,但我想要相反。

编辑: 我考虑过创建一个仅作为 R 脚本来源的 sweave 文件,但我每次都需要编辑 sweave 文件,而且它不能很好地处理绘图和图形。

所以对于这样的示例 R 脚本(伪代码,可能无法运行)

head(mcars)
1+1
x<-3
describe(mcars)
p <- ggplot(mtcars, aes(wt, mpg)) 
p + geom_point() 
print(p)

它会生成

<<echo=TRUE, result=latex>>= 
print(xtable(head(mcars)))
@ 
<<echo=TRUE, include=TRUE>>=
1+1
x<-3
@ 
<<echo=TRUE, result=latex>>= 
print(xtable(describe(mcars)))
@ 
<<echo=TRUE, fig=TRUE, include=TRUE>>= 
p <- ggplot(mtcars, aes(wt, mpg)) 
p + geom_point() 
print(p)
@ 

有人做过吗?

【问题讨论】:

  • 我已经为帮助程序包中的 HTML 完成了此操作,但没有为 Latex 完成此操作。
  • 有趣的想法。似乎它需要对 R 有相当复杂的理解。但是可以使用 perl 脚本(由一组可配置的规则驱动)来完成一些可行的事情。

标签: r sweave


【解决方案1】:

我有一个名为knitr 的包正在开发中,它可能适合您,但我需要警告您,它仍处于开发的早期阶段,因此可能存在错误。阅读不完整手册https://github.com/downloads/yihui/knitr/knitr-manual.pdf中的代码参考部分@

基本上你在 Sweave 中写一个空块,就像

<<my-chunk-label>>=
@

并且您在外部 R 脚本中使用相同的标签(例如 foo.R

## @knitr my-chunk-label
1 + 1; x <- 3

chunk选项ref用于指定脚本的路径(如ref=foo.R); knitr 将读取 R 脚本并将标签与 Rnw 文档匹配。

【讨论】:

    【解决方案2】:

    不,但是从source(file, echo=TRUE) 构建一个并不难。使用以下函数,以下函数将创建一个 LaTeX 文件。试试看!

    latexR("code.R")
    

    我尝试使用以下code.R 文件:

    c("hi",
      "there")
    1+1
    a <- 5
    plot(1:a) # a plot
    # hi there
    data.frame(a=1:5, b=LETTERS[1:5])
    

    以下是函数。 latex S3 方法是如何让它为给定的对象类型输出特殊的 LaTeX 格式,否则它只是逐字输出。它还设置了默认图形设备以保存为 pdf 并输出文件名。

    latex <- function(obj) {
      UseMethod("latex")
    }
    latex.data.frame <- function(obj) {
      print(xtable(obj), floating=FALSE)
    }
    latex.default <- function(obj) {
      cat("\\begin{Soutput}\n")
      if (isS4(obj)) 
        methods::show(obj)
      else print(obj)
      cat("\\end{Soutput}\n")
    }
    
    fig <- function(...) {
      i <<- i+1
      n <- paste(nam, formatC(i, width=3, flag="0"), sep="-")
      f <- paste(n, "pdf", sep=".")
      cat("\\includegraphics{", n, "}\n",sep="")
      pdf(file=f, ...)
    }
    
    stopfig <- function() { if(dev.cur()!=1) dev.off() }
    
    latexR <- function(file, base=sub(".R","", file)) {
      eval.with.vis <- function(expr, envir = parent.frame(), enclos = if (is.list(envir) ||
                             is.pairlist(envir)) parent.frame() else baseenv())
        .Internal(eval.with.vis(expr, envir, enclos))  
      on.exit(sink())
      sink(paste(base,"tex",sep="."))
      cat("\\documentclass{article}\n\\usepackage{Sweave}\n\\begin{document}\n") 
      environment(fig) <- list2env(list(i=0, nam=base))
      options(device=fig)
      exprs <- parse(file)
      srcrefs <- attr(exprs,"srcref")
      lastshown <- 0
      for(i in seq_along(exprs)) {
        srcref <- srcrefs[[i]]
        dep <- getSrcLines(attr(srcref, "srcfile"), lastshown+1, srcref[3L])
        lastshown <- srcref[3L]
        cat("\\begin{Sinput}\n", paste(dep, collapse="\n"), "\n\\end{Sinput}\n", sep="")
        yy <- eval.with.vis(exprs[i])    
        stopfig()
        if(yy$visible) latex(yy$value)
      }
      cat("\\end{document}")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 2016-09-20
      • 1970-01-01
      相关资源
      最近更新 更多