如何将R text + image输出捕获到一个文件(html,doc,pdf等)?

时间:2010-09-28 21:21:08

标签: r sweave knitr

任务是创建一个文件(word,rtf,pdf,html或其他),它将R的输出(例如:不是创建输出的代码)捕获到该格式(包括文本图片)。

这样做的方式应该是尽可能少地改变原始的R脚本。

如果我只关心文字或图像,那么我会使用?sink,或?pdf。但我不知道如何以简单的方式将两者合并为一个输出。

我知道export R output using r2wd还有一种方法,但是根据我的口味,它在原始代码中涉及太多的问题(我想,对于sweave解决方案也是如此,尽管我没有使用它的经验告诉)

以下是未来示例的示例代码:

START.text.and.image.recording("output.file") # this is the function I am looking for
x <- rnorm(100)
y <- jitter(x)
print(summary(x))
print(head(data.frame(x,y)))
cor(x,y)
plot(x,y)
print(summary(lm(y~x)))
STOP.text.and.image.recording("output.file") # this is the function I am looking for

更新:我被问到不是来自ReproducibleResearch task view的Sweave或其他选项。

原因是:

  1. 我(还)不知道LaTeX
  2. 即使知道LaTeX,我也想要一些简单的默认设置简单地将所有输出一起转储,并按顺序排列。 “简单”意味着 - 尽可能少的额外代码/文件管理开销。
  3. 我知道像sweave或brew这样的东西更具可扩展性,但我希望看看是否有更简单的解决方案适用于较小的项目/脚本。

11 个答案:

答案 0 :(得分:13)

截至2012年knitr为此问题提供了完美的解决方案。

例如,创建一个扩展名为rmd的文件。将代码包装在几个命令中,如下所示:

```{r}
x <- rnorm(100)
y <- jitter(x)
print(summary(x))
print(head(data.frame(x,y)))
cor(x,y)
plot(x,y)
print(summary(lm(y~x)))
```

您可以通过多种方式将其转换为自包含的HTML文件。在RStudio中,您只需按一个按钮Knit HTML即可。 这是HTML file produced;实际查看HTML在浏览器中的显示方式,保存文件并打开它。

图像代码和输出交织在一起,如您所料。

当然,您可以并且通常会将文件分成多个R代码块。但问题是,你没有必要。

以下是我创建的另外几个例子:

答案 1 :(得分:4)

如果你认识LaTeX,那么sweave可能是你最好的选择。 odfWeave是一种类似的机制,但用于将代码嵌入OpenOffice.org文件中。对于HTML,有R2html包。但是所有这些都可能需要您稍微破解代码以充分利用系统。或者,您的sweave / odfweave / html模板可以在单个代码块中获取脚本的数据生成方面,并在需要的位置放置输出显示(print()语句)。您也可以在脚本中调用图形,以生成要作为单独文件嵌入文档的图形,然后将其手动包含在模板中。

例如(并且这个不是一个完整的.Rnw文件,用于在一个sweave文件中运行sweave)你放了这样的东西在模板中向上,该模板来源R脚本的主要部分,它将进行分析并生成R对象:

<<run_script, eval=TRUE, echo=FALSE, results=hide>>=
source("my_script.R")
@

然后,您需要在想要打印输出的地方插入代码块:

<<disp_output, eval=TRUE, echo=FALSE, results=verbatim>>=
## The results=verbatim is redundant as it is the default, as is eval=TRUE
print(summary(x)) ## etc
@

然后你需要块来插入数字。

将分析代码与输出(打印和/或数字)分开也可能是一种很好的做法,特别是如果分析代码在计算方面的代价很高。您可以运行一次 - 甚至缓存它 - 同时根据需要更新输出/显示代码。

示例文件

使用csgillespie的示例文件,我会像这样设置。首先是包含核心分析代码的my_script.R文件:

x <- rnorm(100)
y <- jitter(x)
corXY <- cor(x,y)
mod.lm <- lm(y~x)

然后是Sweave文件

\documentclass[12pt]{article}
\usepackage{Sweave}
\begin{document}

An introduction
<<run_analysis, eval=TRUE,echo=FALSE, results=hide>>=
source("my_script.R")
@

% Later
Here are the results of the analysis
<<show_printed_output, echo=FALSE>>=
summary(x))
head(data.frame(x,y))
@

The correlation between \texttt{x} and \texttt{y} is:
<<print_cor, echo=FALSE>>=
corXY
@

Now a plot
\begin{figure}[h]
    \centering
<<echo=FALSE, eval=TRUE, fig=TRUE, width=6, height=4>>=
plot(x,y)
@ 
\caption{\textit{A nice plot.}}
\end{figure}

\end{document}

你似乎想要的东西并不存在;将R代码和输出组合成文档文件的简单方法。那就是如果你不认为发誓和它的同类简单。您可能需要重新考虑您想要做什么或如何安排分析,图形和输出代码,但您可能最好看一下建议的选项之一(sweave,odfweave,brew,R2html)。

HTH

答案 2 :(得分:4)

我鼓励你使用Sweave,但使用sink()可以实现一个不太好的基本功能。

常规txt文件:

sink(file = "test.txt", type = "output")
summary(cars)
sink()

或添加一些HTML标记:

sink(file = "tal_test.html", type = "output")
cat("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"", "\n")
cat("\"http://www.w3.org/TR/html4/strict.dtd\">", "\n")
        cat("<HTML>", "\n")
        cat("<HEAD>", "\n")
        cat("<TITLE>My first HTML document</TITLE>", "\n")
        cat("</HEAD>", "\n")
        cat("<BODY>", "\n")
        summary(cars)
        cat("</BODY>", "\n")
        cat("</HTML>", "\n")
sink()

答案 3 :(得分:3)

大约一年前我写了一个名为Roux的脚本。我希望能够通过运行R脚本(包括任何图像)来创建HTML脚本,而无需更改脚本。

您可以从命令行调用Roux,如下所示: roux example.R

和roux将:

  • 在R中运行脚本(首先需要Roux包)
  • 语法使用Pygments
  • 突出显示.Rout输出
  • 将图片插入正确的位置

Roux R软件包是一个非常小的R软件包,可以修改plot()和其他一些函数来自动写入随机文件名而不是默认的交互式图形设备。

我经常使用它,它对我来说非常好用,虽然我确定如果有更多人将它用于新包装,那么会出现小问题,很可能你会有一个不同的功能产生一个图表和Roux不会知道它应该为您打开PNG设备。

自从与Tal谈论此事后,我已经更新并改进了代码,现在它已经在这里了: http://bitbucket.org/ananelson/roux/src

因此,如果您遇到任何问题,请在Bitbucket上向问题跟踪器报告。

我已经添加了对LaTeX成绩单的支持,因此您可以轻松创建包含R脚本(包括图像)的PDF的PDF。 (如果查看example-output目录,可以查看示例,找到要下载的“raw”链接。)

你需要安装Python和pygments python库。如果你有旧版本的Python并遇到任何问题,请告诉我。

我在博客上写过关于Roux的文章,但没有那么多宣传,因为我的工作主要集中在一个名为Dexy的新项目上,该项目旨在替代Sweave。如果您想要更多的灵活性和控制,或者对文化文档感兴趣,那么您可能也想查看Dexy。

答案 4 :(得分:2)

您在提问中提到了sweave,但实际上并不适合。你的问题对Sweave来说似乎很完美。实际上,您的示例代码可能来自第二个Sweave example

示例Sweave文件

如果你知道乳胶,那么Sweave就不那么难了。这是你的示例文件作为Sweave文件:

\documentclass[12pt,BCOR3mm,DIV16]{scrreprt}
\usepackage{Sweave}
\begin{document}

An introduction
<<eval=TRUE,echo=TRUE>>=
x <- rnorm(100)
y <- jitter(x)
print(summary(x))
print(head(data.frame(x,y)))
cor(x,y)
@ 
Now a plot
\setkeys{Gin}{width=0.5\textwidth}
\begin{figure}[h]
    \centering
<<echo=FALSE, eval=TRUE, fig=TRUE, width=6, height=4>>=
plot(x,y)
@ 
\caption{\textit{A nice plot.}}
\end{figure}

\end{document}

在linux下,只需将文件另存为tmp.Rnw。然后

R CMD Sweave tmp.Rnw
pdflatex tmp.tex

答案 5 :(得分:2)

还有LyX,它有一个Sweave接口。 R / LyX / Sweave接口代码位于http://cran.fhcrc.org/contrib/extra/lyx/的CRAN上。 LyX本身就是大多数Linux发行版。所有这些魔法都可以在Windows上运行,但它绝对不是一件容易的事。在Windows上,我建议使用蓝色参考的推理来进行识字R编程。

答案 6 :(得分:2)

好吧,我只是提醒我使用Asciidoc进行简短报道或编辑网页。现在有一个R plugin(CRAN上的ascii),它允许将R代码嵌入到asciidoc文档中。语法与Markdown或Textile非常相似,因此您将非常快速地学习它。

输出是(X)HTML,Docbook,LaTeX,当然还有PDF通过最后两个后端之一。

不幸的是,我认为您不能将所有代码都包装在一个语句中。但是,它支持大量R对象,见下文。

> methods(ascii)
 [1] ascii.anova*              ascii.aov*                ascii.aovlist*            ascii.cast_df*           
 [5] ascii.character*          ascii.coxph*              ascii.CrossTable*         ascii.data.frame*        
 [9] ascii.default*            ascii.density*            ascii.describe*           ascii.describe.single*   
[13] ascii.factor*             ascii.freqtable*          ascii.ftable*             ascii.glm*               
[17] ascii.htest*              ascii.integer*            ascii.list*               ascii.lm*                
[21] ascii.matrix*             ascii.meanscomp*          ascii.numeric*            ascii.packageDescription*
[25] ascii.prcomp*             ascii.sessionInfo*        ascii.simple.list*        ascii.smooth.spline*     
[29] ascii.summary.aov*        ascii.summary.aovlist*    ascii.summary.glm*        ascii.summary.lm*        
[33] ascii.summary.prcomp*     ascii.summary.survfit*    ascii.summary.table*      ascii.survdiff*          
[37] ascii.survfit*            ascii.table*              ascii.ts*                 ascii.zoo*               

   Non-visible functions are asterisked

答案 7 :(得分:2)

这是根据罗穆诺夫的回答,但仍然如此。您可以编写自己的打印,以一些HTML格式包装输出,并将输出嵌入到HTML文件中。使用Data URI scheme的图片也可以这样做,例如使用base64 R包中的img函数。

答案 8 :(得分:2)

您可以使用R2HTML包将会话输出到html,并且TeachingDemos包中有一些类似的函数(请参阅txtStart)以输出到增强的文本和单词(通过R2wd)。非图形命令将自动包含在文件中,并且可以通过单个命令插入当前图表。

答案 9 :(得分:1)

通过Twitter的奇迹,有人伸出手向我发送了一个this page的链接,关于一个名为“roux”的包裹。它创建于一年前,我从未听说过它(显然你们大多数都没有)。

这个软件包在我的问题中似乎完全符合我的要求,尽管安装看起来并不重要。

我希望能够使用这个解决方案,并看看其他R成员是否可以参与此项目以更好地增强R.

答案 10 :(得分:0)

@znmeb很好地建议尝试Lyx - 一个更像LaTeX的字样前端,正如文档所指出的那样,在this edition of R news的第2页上有一篇很好的文章与Sweave一起使用

这就是我在Ubuntu 10.04中按照lyx sweave repository中的指导原则执行的操作:

sudo apt-get install lyx
cd ~./lyx
wget http://cran.fhcrc.org/contrib/extra/lyx/preferences
cd layouts
wget http://cran.fhcrc.org/contrib/extra/lyx/literate*
wget http://cran.fhcrc.org/contrib/extra/lyx/literate-article.layout
wget http://cran.fhcrc.org/contrib/extra/lyx/literate-book.layout
wget http://cran.fhcrc.org/contrib/extra/lyx/literate-report.layout
wget http://cran.fhcrc.org/contrib/extra/lyx/literate-scrap.inc
cd ~/texmf/tex
wget http://www.biostat.jhsph.edu/~rpeng/ENAR2009/Sweave.sty
  1. 启动Lyx
  2. 偏好设置 - &gt;重新配置
  3. 重启Lyx
  4. 文件 - &gt;新
  5. 文件 - &gt;设置 - &gt;文件类 - &gt;文章(Sweave noweb)
  6. 有用的链接: