有没有办法将R脚本文件推送到sweave文档(与纠结相反)

时间:2011-11-08 22:10:11

标签: r sweave

我经常创建特定的sweave文件来进行分析并生成pdf文档,但是,有时我想获取现有的R脚本文件并在生成命令和输出的pdf的同时运行它。我知道有一个纠结命令可以将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)
@ 

有人这样做过吗?

2 个答案:

答案 0 :(得分:6)

我正在开发一个名为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

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

答案 1 :(得分: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}")
}