代码之家  ›  专栏  ›  技术社区  ›  Tal Galili

如何将R文本+图像输出捕获到一个文件(html、doc、pdf等)中?

  •  17
  • Tal Galili  · 技术社区  · 14 年前

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

    这样做的方法应该包括对原始R脚本尽可能少的更改。

    我知道有办法 export R output using r2wd ,但是对于我的口味来说,它在原始代码中涉及了太多的插科打诨(我认为对于swave解决方案也是如此,尽管我没有经验告诉你)

    下面是一个示例代码,供以后的示例使用:

    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

    1. 我还不知道
    2. 即使知道乳胶,我想要一些简单的默认值 简单地 将所有输出按顺序一起转储。”“简单”意味着尽可能少的额外代码/文件管理开销。

    我知道像swave或brew这样的东西更具可伸缩性,但我想看看是否有一个更“简单”的解决方案用于较小的项目/脚本。

    11 回复  |  直到 12 年前
        1
  •  14
  •   Jeromy Anglim    13 年前

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

    ```{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代码块。但关键是,你不必这么做。

    下面是我创建的另两个示例:

        2
  •  4
  •   Community CDub    5 年前

    如果你知道乳胶,Swave可能是你最好的选择。odfWeave是一种类似的机制,但用于将代码嵌入OpenOffice.org网站文件。对于HTML,有R2html包。但所有这些都可能需要您对代码进行一点分解,以便从系统中获得最佳效果。或者,您的swave/odfweave/html模板可以在单个代码块中获取脚本的数据生成方面,并显示输出( print() 声明)放置在需要的地方。您的图形也可以在脚本中调用,以生成要作为单独文件嵌入到文档中的图形,然后手动将其包含在模板中。

    例如(还有这个) 不是吗 .Rnw sweave )在一个swave文件中,你会在模板中放一些类似这样的东西,它是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
    @
    

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

    示例swave文件

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

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

    \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}
    

    HTH公司

        3
  •  4
  •   Roman LuÅ¡trik    14 年前

    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()
    
        4
  •  3
  •   Ana Nelson Ana Nelson    14 年前

    大约一年前,我写了一个叫做Roux的剧本。我希望能够从运行R脚本(包括任何图像)创建HTML脚本,而不必更改脚本。

    从命令行调用Roux,如下所示: roux示例.R

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

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

    我已经用了很多,它对我来说非常好,虽然我相信如果更多的人使用新的软件包,那么小问题就会出现,很可能你会有一个不同的功能,生成一个图形和Roux不会知道它应该为你打开一个PNG设备。

    自从和Tal谈到这一点后,我已经更新和改进了代码,现在在这里: http://bitbucket.org/ananelson/roux/src

    我已经添加了对乳胶成绩单的支持,这样你就可以轻松地创建pdf,其中包含R脚本的成绩单和图像。(如果您查看示例输出目录,可以看到一个示例,找到“raw”链接下载它。)

    您确实需要安装Python和Pygments Python库。如果你有一个旧版本的Python和运行任何问题,请让我知道。

    我在我的博客上写了关于Roux的文章,但没有公开太多,因为我的工作集中在一个名为Dexy的新项目上,这个项目是作为Swave的替代品。如果你想要更大的灵活性和控制力,或者对有文化的文档感兴趣,那么你也可以去看看Dexy。

        5
  •  2
  •   csgillespie Carl Witthoft    14 年前

    sweave 在你的问题,但不是真的为什么它不适合。你的问题似乎很适合斯威夫。事实上,您的示例代码可能来自第二个swave example .

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

    \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
    
        6
  •  2
  •   znmeb znmeb    14 年前

    还有LyX,它有一个swave接口。R/LyX/swave接口代码位于 http://cran.fhcrc.org/contrib/extra/lyx/ . LyX本身在大多数Linux发行版中都有。所有这些魔法都可以在Windows上使用,但绝对不是小事。在Windows上,我建议从bluereference中推断R,以便编写R程序。

        7
  •  2
  •   chl    14 年前

    Asciidoc 用于简短的报告或编辑网页。现在有一个 R plugin ( ascii 在CRAN上),它允许将R代码嵌入到asciidoc文档中。语法与Markdown或Textile非常相似,因此您将很快学会它。

    > 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
    
        8
  •  2
  •   mbq    14 年前

    这与罗姆诺夫的回答是一致的,但仍然如此。您只需编写自己的打印文件,将输出包装成一些HTML格式,并将输出嵌入到HTML文件中。同样的方法也适用于带有 Data URI scheme ,例如使用 img base64

        9
  •  2
  •   Greg Snow    13 年前

    你可以用 R2HTML 包将会话输出为html,在 TeachingDemos txtStart )用于输出到增强的文本和单词(通过 R2wd ). 非图形命令将自动包含在文件中,并且可以通过单个命令插入当前绘图。

        10
  •  1
  •   BenMorel Manish Pradhan    11 年前

    通过twitter的奇迹,有人主动联系我,给我发了一个链接 this page ,关于一个叫“roux”的包裹。它是一年前创建的,我从来没有听说过(显然你们大多数人也没有听说过)。

    这个软件包似乎完全符合我的问题,虽然安装似乎不平凡。

    我希望使用这个解决方案,同时也希望看看其他R成员是否可以加入这个项目来更好地增强R。

        11
  •  0
  •   David LeBauer    14 年前

    @znmeb提出了一个很好的建议来尝试Lyx——一个更像乳胶前端的词,正如文档所指出的,在第2页的swave中有一篇很好的文章介绍了它的用法 this edition of R news

    这就是我在ubuntu10.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. 首选项->重新配置
    2. 重新启动Lyx
    3. 文件->新建

    有用的链接: