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

Tal*_*ili 18 r sweave knitr

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

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

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

我知道有一种方法可以使用r2wd导出R输出,但是根据我的口味它在原始代码中涉及太多的介绍(我认为对于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
Run Code Online (Sandbox Code Playgroud)

更新:我被问到方式不是Sweave,或ReproducibleResearch任务视图中的其他选项.

原因是:

  1. 我(还)不知道LaTeX
  2. 即使知道LaTeX,我想要一些简单的默认设置,只需将所有输出一起转储,然后按顺序排列."简单"意味着 - 尽可能少的额外代码/文件管理开销.

我知道像sweave或brew这样的东西更具可扩展性,但我希望看看是否有更简单的解决方案适用于较小的项目/脚本.

Jer*_*lim 14

截至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)))
```
Run Code Online (Sandbox Code Playgroud)

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

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

当然,您可以并且通常会将文件分成多个R代码块.但重点是,你不必.

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


Rei*_*son 5

如果您了解 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")
@
Run Code Online (Sandbox Code Playgroud)

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

<<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
@
Run Code Online (Sandbox Code Playgroud)

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

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

示例 Swave 文件

使用 csgillespie 的示例 sweave 文件,我将进行如下设置。首先my_script.R是包含核心分析代码的文件:

x <- rnorm(100)
y <- jitter(x)
corXY <- cor(x,y)
mod.lm <- lm(y~x)
Run Code Online (Sandbox Code Playgroud)

然后是 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}
Run Code Online (Sandbox Code Playgroud)

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

华泰


Rom*_*rik 5

我鼓励您使用 Sweave,但是使用sink().

一个普通的txt文件:

sink(file = "test.txt", type = "output")
summary(cars)
sink()
Run Code Online (Sandbox Code Playgroud)

或者添加一些 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()
Run Code Online (Sandbox Code Playgroud)

  • 如何自动包含图像? (2认同)