跳转到内容

R 编程/出版质量输出

来自维基教科书,开放世界中的开放书籍

数字格式化

[编辑 | 编辑源代码]

您可以使用 format() 函数来控制显示对象的位数和其他特性。

> df <- data.frame(x = rnorm(10), y = rnorm(10))
> print(df)
            x          y
1  -0.4350953 -0.6426477
2  -0.5947293 -0.2389625
3  -0.7061850 -2.4382016
4  -0.3384038 -0.6322842
5   0.2713353  0.5396409
6  -1.1144711 -2.0321274
7  -1.0356184  1.7217443
8  -2.6665278 -0.3621377
9   0.2975570  0.1598905
10  1.4631458 -0.7995652
> print(format(df, digits=3, scientific=T))
           x         y
1  -4.35e-01 -6.43e-01
2  -5.95e-01 -2.39e-01
3  -7.06e-01 -2.44e+00
4  -3.38e-01 -6.32e-01
5   2.71e-01  5.40e-01
6  -1.11e+00 -2.03e+00
7  -1.04e+00  1.72e+00
8  -2.67e+00 -3.62e-01
9   2.98e-01  1.60e-01
10  1.46e+00 -8.00e-01

Sweave[1] 是一种文学编程语言,它集成了 LaTeX 和 R 代码。Sweave 文件生成一个 LaTeX 文件和一个 R 文件,这些文件可以编译。Roger Koenker[2]、Meredith 和 Racine (2009)[3] 以及 Charles Geyer[4] 认为 Sweave 有利于可重复的计量经济学/统计学研究。

Sweave 有一些替代方案,用于进行文学编程。其中一个是 Babel,它包含在 Emacs Orgmode[5] 中。此工具允许导出到 LaTeX 和 HTML。还可以包括用于各种编程语言(R、Ruby 等)的代码块。

主要思想是编写一个包含 LaTeX 和 R 代码的文件。LaTeX 代码以以下开头@而 R 代码以以下开头<<>>=(一些选项可以包含在以下之间<<>>).

@
% Some LaTeX code
\section{Results}
I show that ...
<<>>=
# Some R code
qnorm(.975)
@
% Some LaTeX code
$$
\Phi^{-1}(.975) = 1.96 
$$

该文件以扩展名保存.Rnw.rnw。最后,使用以下命令从该文件中提取一个 R 文件Stangle()以及一个使用以下命令生成的 LaTeX 文件Sweave()。以下是一个名为file.Rnw的文件示例,它生成file.texfile.R

> Sweave("file.Rnw")
Writing to file file.tex
Processing code chunks ...
 1 : echo keep.source term verbatim pdf
 2 : echo keep.source term verbatim pdf
> Stangle("file.Rnw")
Writing to file file.R

然后,您可以对 file.tex 运行 LaTeX。这可以使用以下方法完成system()函数或texi2dvi().

# Example under Windows :
system("pdflatex.exe -shell-escape file.tex") # runs pdflatex
system("open file.pdf") # opens the pdf

请注意,您可能需要从互联网上下载 Sweave.sty,因为它不是标准 MikTeX 发行版的一部分。

您还可以使用以下命令在文本中添加结果\Sexpr{}函数。

$
\Phi^{-1}(.975) = \Sexpr{qnorm(.975)} 
$

有一些选项。这些选项可以包含在每个代码块中,也可以包含在 Sweave 命令中。

  • 对于图形,您可以使用以下命令将它们包含在 tex 文件中fig=T或者使用以下命令不包含它们fig=F.

默认情况下,图形以 pdf 和 eps 文件格式导出。如果您只想使用一种格式,请使用以下命令禁止另一种格式pdf=Feps=F选项。

  • 可以使用以下命令在 tex 文件中显示 R 代码echo=T。如果您不想将它包含在 tex 文件中,请使用echo=F.
  • 可以使用以下命令评估 R 代码eval=T。如果您不想评估 R 代码,请使用eval=F.
  • 结果 
    • results=tex将输出视为 LaTeX 代码
    • results=verbatim将输出视为 Verbatim(默认值)
    • results=hide在 LaTeX 输出中不包含结果

这些选项可以传递给Sweave()函数。

Sweave("file.Rnw", pdf = T, eps=F, echo = F, results = "verbatim")

它们也可以传递给每个代码块。

<<fig=T,pdf=T,eps=F>>=
plot(rnorm(100), col = "red")
@

用于 Sweave 的文本编辑器

[编辑 | 编辑源代码]

Sweave 的主要问题是,很少有文本编辑器包含对 Sweave 的语法突出显示功能。以下是一些例外 

  • RStudio 是一款非常好的解决方案。它易于安装和使用,并且包含用于运行 Sweave 文件的按钮。
  • Vim 为 Sweave 文件提供了语法突出显示功能(R no web syntax)。
  • Emacs + ESS (Emacs Speaks Statistics) 为 Sweave 文件提供全面支持。它包括一个用于运行 Sweave 文件的键盘快捷键,以及在 LaTeX 和 R 之间切换的语法突出显示功能。
  • Eclipse StatET 插件为 Sweave(LaTeX/R)文档提供了支持,其中包含所有基本功能(语法突出显示、括号匹配、切换注释等),以及对 R 代码块的检测。

另请参阅

[编辑 | 编辑源代码]

以下是一些 Sweave 文档示例 

  • Charles Geyer foo.Rnw 示例
  • Julien Barnier 的 R 入门(法语文档)
  • 技巧 : 键入filetype:Rnwfiletype:Snw在 Google 中搜索以获取 Sweave 文件
  • 请注意,您可以通过浏览 R 库文件夹来找到大量示例。文档通常使用 Sweave 编写,并且 Sweave 文件通常包含在包中。例如,在np 包的 doc 文件夹中。

一些讲义 

  • "使用 Sweave 和 DOCSTRIP 进行文学编程"(pdf)作者:Michael Lundholm
  • Charles Geyer 2008 "Sweave 演示"(pdf)(简短)
  • 使用 APA 样式学习 Sweave[6]

一些包

  • pgfSweave
  • ascii
  • cacheSweave
  • exam 用于自动生成考试

一些替代的文学编程包 

  • odfWeave 包用于使用 OpenOffice 进行 Sweave。
  • knitr
  • decumar,Hadley Wickham[7] 为 R 提供的文学编程接口
  • relax
  • wikirobot[8] 与 Sweave 相似,但适用于 MediaWiki。

Pubprint 是一款小型实用程序,能够将统计检验的输出转换为可供出版的输出。Pubprint 能够将输出导出为多种格式(HTML、LaTeX、Markdown 和纯文本),但不幸的是,它仅支持 APA 样式(美国心理学会的出版样式)。但是,这种样式被广泛使用,并且可能在更多情况下适用。

> library("pubprint")
> pprint(t.test(rnorm(30), rnorm(30)))
[1] "(\\ensuremath{M\\ifmmode_{x}\\else\\textsubscript{x}\\fi=-0.05,M\\ifmmode_{y}\\else\\textsubscript{y}\\fi=0.09,t[57.74]=-0.49,p=.628})"

显然,pubprint 打印的是 LaTeX 格式化的字符串,但可以更改输出格式(根据手册,pubprint 旨在与 knitr 一起使用,并且如果与 knitr 一起使用,它会自动检测输出格式)。

> pp_opts_out$set(pp_init_out("plain"))
> pprint(t.test(rnorm(30), rnorm(30)))
[1] "(M_x=-0.14,M_y=-0.24,t[57.4]=0.41,p=.682)"
> pprint(cor.test(rnorm(30), rnorm(30)))
[1] "(r=-.08,p=.693)"

输出可以粘贴到文档中,也可以包含在 knitr/sweave\Sexpr{}语句中。

R 包含许多函数,这些函数允许它将结果导出到 LaTeX[9]

通用函数

[编辑 | 编辑源代码]

toLatex()位于utils 包中。

  • 请注意toLatex()不处理矩阵。
  • toLatex()已在memisc 包中进行了调整,以处理矩阵和 ftable。
> toLatex(sessionInfo())
\begin{itemize}
  \item R version 2.2.0, 2005-10-06, \verb|powerpc-apple-darwin7.9.0|
  \item Base packages: base, datasets, grDevices,
    graphics, methods, stats, utils
\end{itemize}
  • mat2tex()sfsmisc)将矩阵导出到 LaTeX。
  • tex.table()cwhmisc)包将数据框导出到 LaTeX 表格。
> tex.table(mydat)
\begin{table}[ht]
\begin{center}
\begin{footnotesize}
\begin{tabular}{r|rrr}
\hline
 & y & x1 & x2\\ \hline
1 & -0.09 & -0.37 & -1.04\\ 
2 & 0.31 & 0.19 & -0.09\\ 
3 & 3.78 & 0.58 & 0.62\\ 
4 & 2.09 & 1.40 & -0.95\\ 
5 & -0.18 & -0.73 & -0.54\\ 
6 & 3.16 & 1.30 & 0.58\\ 
7 & 2.78 & 0.34 & 0.77\\ 
8 & 2.59 & 1.04 & 0.46\\ 
9 & -1.96 & 0.92 & -0.89\\ 
10 & 0.91 & 0.72 & -1.1\\ 
\hline
\end{tabular}
\end{footnotesize}
\end{center}
\end{table}


  • xtable()xtable)将各种对象(包括表格、数据框、lm、aov 和 anova)导出到 LaTeX。
> # lm example
> library(xtable)
> x <- rnorm(100)
> y <- 2*x + rnorm(100)
> lin <- lm(y~x)
> xtable(lin)
% latex table generated in R 2.15.1 by xtable 1.7-0 package
% Sun Sep 23 21:54:04 2012
\begin{table}[ht]
\begin{center}
\begin{tabular}{rrrrr}
  \hline
 & Estimate & Std. Error & t value & Pr($>$$|$t$|$) \\ 
  \hline
(Intercept) & -0.0407 & 0.0984 & -0.41 & 0.6803 \\ 
  x & 2.0466 & 0.1043 & 19.63 & 0.0000 \\ 
   \hline
\end{tabular}
\end{center}
\end{table}

> # table example
> x <- sample(1:10, 30, replace = T)
> tab <- table(x)
> tab <- cbind(tab, prop.table(tab))
> colnames(tab) <- c("N.", "Prop.")
> xtable(tab, digits = c(0, 0, 2))
% latex table generated in R 2.15.1 by xtable 1.7-0 package
% Sun Sep 23 22:06:36 2012
\begin{table}[ht]
\begin{center}
\begin{tabular}{rrr}
  \hline
 & N. & Prop. \\ 
  \hline
1 & 5 & 0.17 \\ 
  3 & 1 & 0.03 \\ 
  4 & 3 & 0.10 \\ 
  5 & 6 & 0.20 \\ 
  6 & 5 & 0.17 \\ 
  7 & 3 & 0.10 \\ 
  8 & 2 & 0.07 \\ 
  9 & 2 & 0.07 \\ 
  10 & 3 & 0.10 \\ 
   \hline
\end{tabular}
\end{center}
\end{table}

另请参阅 

  • Romain François 的highlight 包将 R 代码导出到 LaTeX 和 HTML。
  • format.df()latex()位于Hmisc 包中。
  • MEMISCquantreg 包包含其他latex()函数。

描述性统计

[编辑 | 编辑源代码]
  • estout 包。
  • reporttools 包包含一些用于描述性统计表的功能[10]

估计结果

[编辑 | 编辑源代码]
  • stargazer 包提供了一种简单的方法来将回归结果导出到 LaTeX[11]
  • texreg 提供了类似的功能[12]
  • estout 包提供类似于 Stata 的功能esttabestout实用程序[13]。估计结果使用eststo()存储,并使用esttab()打印。它们可以导出到 CSV 和 LaTeX。这些功能支持lm, glmplm对象(参见 plm 包)。
  • apsrtable()apsrtable)以类似于美国政治科学评论出版标准的方式将多个回归的结果导出到 LaTeX。
  • Thextablextable 包)导出数据框、矩阵、估计结果[14]xtable()也可以用来将结果导出到 HTML 文件。
  • The outreg() function[15] 由 Paul Johnson 开发,类似于 Stataoutreg[16] 函数。请参阅关于此主题的 "R you ready ?" 博客文章
  • mtable()toLatex()在 'memisc 包中。
N <- 10^3
u <- rnorm(N)
x1 <- rnorm(N)
x2 <- x1 + rnorm(N)
y <- 1 + x1 + x2 + u
lm1 <- lm(y ~ x1 + x2 )
lm2 <- lm(y ~ x1 + x2 + I(x1*x2))

library(estout)
estclear() # clear all the eststo objects
eststo(lm1) 
eststo(lm2)
esttab() # print it

library("apsrtable")
apsrtable(lm1,lm2)

library(xtable)
xtable(lm1)
tab <- xtable(lm1)
print(tab,type="html")

source("http://pj.freefaculty.org/R/WorkingExamples/outreg-worked.R")
outreg(list(lm1,lm2))

library("memisc")
toLatex(mtable(lm1,lm2))

导出到 HTML

[编辑 | 编辑源代码]

rpublisher[17] 是一种将结果发布到 HTML 的 literate programming 语言(它基于 python,最后一次更新是在 2008 年)。


参见 R2HTMLxtablehwriterprettyRhighlightHTMLUtils


wiki.table()hacks 包中将矩阵或数据框导出到 Mediawiki 表标记(如在本维基和其他许多维基中使用的那样)。

> wiki.table(matrix(1:16,4),caption="Test")
{|  
|+ Test 
| 1 || 5 || 9 || 13 
|-
| 2 || 6 || 10 || 14 
|-
| 3 || 7 || 11 || 15 
|-
| 4 || 8 || 12 || 16 
|}

参考文献

[编辑 | 编辑源代码]
前一个:文本处理 索引
华夏公益教科书