Permalink
Browse files

runk ./knit

  • Loading branch information...
1 parent 029a0ee commit 5114e0a45e2814fc2697c5724899e90cd650733b @yihui committed Apr 16, 2012
Showing with 44 additions and 40 deletions.
  1. +2 −2 01-setup.md
  2. +9 −9 04-character.md
  3. +33 −29 11-auto-report.md
View
@@ -24,7 +24,7 @@ Windows中安装R注意几点:
![去掉安装目录中的版本号目录](http://i.imgur.com/5ZVXx.png)
-![R 2.15.0的安装界面(可选32位或64位的R)](http://i.imgur.com/cbw4T.png)
+![R 2.15.0的安装界面(可选32位或64位的R)](http://i.imgur.com/eI0sM.png)
![R 2.15.0以前可以选择不安装消息翻译文件](http://i.imgur.com/kOphm.png)
@@ -77,7 +77,7 @@ sudo apt-get build-dep r-base-dev
那些Linux软件仓库里放的软件实际上也是通过`make`的方式从源文件一步步编译出来的,只不过是服务器上预先编译好了,省去了用户自行编译和解决依赖的麻烦,直接就可以装编好的二进制包。
-最后是Mac OS,我不熟,以下指导来自杨一帆:同样可以使用编译安装(此时不含GUI,但是Mac预先包含的ATLAS库函数明显优于R自带的BLAS;或者简单地使用<http://cran.r-project.org/bin/macosx/>提供的PKG包,32/64/Intel/PPC版本都包含了GUI。唯一需要注意的是系统的版本,10.4以下的会有各种问题。另外的囧问题就是Mac首次加载绘图窗口会非常慢,等待画图的时候可以泡杯茶等带X11窗口出现。
+最后是Mac OS,我不熟,以下指导来自杨一帆:同样可以使用编译安装(此时不含GUI,但是Mac预先包含的ATLAS库函数明显优于R自带的BLAS;或者简单地使用<http://cran.r-project.org/bin/macosx/>提供的PKG包,32/64/Intel/PPC版本都包含了GUI。唯一需要注意的是系统的版本,10.4以下的会有各种问题。
### R附加包
View
@@ -348,7 +348,7 @@ str(pkgs)
```
- chr [1:7] "[1] \"base\" \"boot\" \"class\" \"cluster\" \"codetools\"" ...
+## chr [1:7] "[1] \"base\" \"boot\" \"class\" \"cluster\" \"codetools\"" ...
```
@@ -360,13 +360,13 @@ cat(pkgs, sep = "\n") # 原始文本
```
-[1] "base" "boot" "class" "cluster" "codetools"
-[6] "compiler" "datasets" "fdrtool" "foreign" "graphics"
-[11] "grDevices" "grid" "KernSmooth" "lattice" "MASS"
-[16] "Matrix" "methods" "mgcv" "monreg" "nlme"
-[21] "nnet" "parallel" "rpart" "spatial" "splines"
-[26] "stats" "stats4" "survival" "tcltk" "tools"
-[31] "utils"
+## [1] "base" "boot" "class" "cluster" "codetools"
+## [6] "compiler" "datasets" "fdrtool" "foreign" "graphics"
+## [11] "grDevices" "grid" "KernSmooth" "lattice" "MASS"
+## [16] "Matrix" "methods" "mgcv" "monreg" "nlme"
+## [21] "nnet" "parallel" "rpart" "spatial" "splines"
+## [26] "stats" "stats4" "survival" "tcltk" "tools"
+## [31] "utils"
```
@@ -380,7 +380,7 @@ str(pkgs) # 31个包名,搞定了
```
- chr [1:31] "base" "boot" "class" "cluster" "codetools" ...
+## chr [1:31] "base" "boot" "class" "cluster" "codetools" ...
```
View
@@ -10,16 +10,14 @@
要使用文学化编程,必须得有一些设定的规则来标记哪些是代码,哪些是正文,否则这事儿没法进行。最早的语法是这样:用`<<>>=`来标记代码的开始,用`@`标记正文的开始,凡是遇到这两类符号,也就意味着要换频道了,下文要标记为代码或正文。例如,
-```
-@
-hello, I will do 1 + 2 next:
+ @
+ hello, I will do 1 + 2 next:
-<<foo>>=
-1 + 2
-@
+ <<foo>>=
+ 1 + 2
+ @
-OK, I'm done now.
-```
+ OK, I'm done now.
这一块文字中包含两段正文和一段代码。编译它的时候,计算机根据前面的规则就知道`<<>>=`下面的是可以运算的代码,而`@`下面是正文,不能当作代码运行。这就是文学化编程的基本思想,它可以很容易移植到自动化报告中来,下面我们再详细说里面的细节问题。Sweave借用了这个思想,把R代码嵌入报告中,编译报告的时候R代码被执行,源文档中的R代码在输出的时候被替换为相应的运行结果,这些结果和原来的报告正文混合起来就形成了一篇有结果的报告。这样,我们只需要维护包含源代码的源文档,让结果文档自动生成,而不要手工运行代码并复制粘贴结果到文档里,这样做既累人又容易出错。记住,只有源代码是可以信赖的。注意我并不是说它的结果一定是对的,或者源代码一定是对的,代码当然可能是错的,但源代码要是错了我们可以检查出来,而要是人工操作哪里出了岔子就很难查错,比如你本来应该点这个按钮,结果你当时点了另一个,如果没有完整的屏幕录像,恐怕追溯结果的来源时就比较困难了。源代码通常是文本文件,可以放入版本控制如GIT或SVN,记录完整的修改历史。附带说一句,版本控制(Version Control)工具是忍者必备工具,后面会用专门用一章讲,你要是不会这东西的话,别跟别人说你看过这本书。
@@ -102,7 +100,7 @@ summary(lm(dist ~ speed, data = cars)) # 一个回归
1 + 2
dnorm(0) # 标准正态分布在0处的密度值
summary(lm(dist ~ speed, data=cars)) # 一个回归
- ````
+ ```
我们用**knitr**编译这段代码,就得到了上面的输出。现在,你应该对自动化报告有一个初步了解了。**Knitr**的网站(<http://yihui.name/knitr>)中有详尽的英文文档和示例,英文方面没有障碍的忍者可以随时查阅。为了新忍入门更快,我在这里把整个故事的梗概叙述一遍,掌握了基本概念之后,再去网站里查阅细节会更容易。
@@ -123,9 +121,21 @@ LaTeX文档(扩展名`Rnw`)里面仍然沿用历史规定,代码放在`<<>
由于LaTeX文档入门门槛高,而网页则相对容易一些,**knitr**在设计之初就考虑了网页格式,它有两种可能:一是原始HTML格式,即把R代码嵌入HTML代码;二是Markdown(下文简称MD),它是非常轻量级的标记语言,可以很方便翻译为HTML语言。我一般倾向于用后者。MD的出现是为了简化HTML,把常用的HTML标签用极度简化的语法写出来,这一点值得程序设计者学习:你可以写一个无所不能但繁琐的程序,也可以写能实现常用功能但简单的程序。R就有前者的特征,尤其是很多函数有长串的参数,看着就让人发蒙,而实际上只有少数参数是常用的,当然,这一点上不必吐槽,因为R是一门基础语言,功能优先。这是题外话。
-HTML文档混合R代码的语法为:以`<!--begin.rcode label, opt=value`开始R代码,以`end.rcode-->`开始正文。全局选项放在`<!--roptions -->`中,行内代码放在`<!--rinline -->`中。熟悉HTML语法的都知道,`<!-- -->`是HTML注释的语法。我对Sweave语法不太满意的一点也在此:文学化编程的文档最好能避免破坏原文档的语法,比如要是我来设计Sweave,我肯定不会用`<<>>=`语法,因为它干扰了TeX文档,我会倾向于把R代码段放在TeX注释中,这样即使不编译,这份文档也是合法的TeX文档。
+HTML文档混合R代码的语法为:以`<!--begin.rcode label, opt=value`开始R代码,以`end.rcode-->`开始正文。全局选项放在`<!--roptions -->`中,行内代码放在`<!--rinline -->`中。熟悉HTML语法的都知道,`<!-- -->`是HTML注释的语法。我对Sweave语法不太满意的一点也在此:文学化编程的文档最好能避免破坏原文档的语法,比如要是我来设计Sweave,我肯定不会用`<<>>=`语法,因为它干扰了TeX文档,我会倾向于把R代码段放在TeX注释中,这样即使不编译,这份文档也是合法的TeX文档。以下是一个简单的HTML例子:
-MD文档语法为:以三个反引号和一对大括号开始R代码,以四个反引号开始正文,上面的hello world例子已经显示了代码段的基本结构。行内代码放在`` `ri ir` ``之中(选ri两个字母的原因是R inline缩写),全局选项在`` `ro or` ``中(R options)。
+ hello, the value of 2 * pi is <!--rinline 2*pi -->
+
+ <!--begin.rcode foo-label
+ rnorm(5)
+ end.rcode-->
+
+MD文档语法为:以三个反引号和一对大括号开始R代码,以三个反引号开始正文,上面的hello world例子已经显示了代码段的基本结构。行内代码放在`` `r ` ``之中,全局选项在`` `ro or` ``中(R options)。以下是一个简单的MD例子:
+
+ hello, the value of 2 * pi is `r 2*pi`
+
+ ``` {r foo-label}
+ rnorm(5)
+ ```
### 文本输出
@@ -197,7 +207,7 @@ xtable(head(mtcars[, 1:5]))
```
<!-- html table generated in R 2.14.2 by xtable 1.7-0 package -->
-<!-- Fri Apr 6 21:40:59 2012 -->
+<!-- Sun Apr 15 21:05:49 2012 -->
<TABLE >
<TR> <TH> </TH> <TH> mpg </TH> <TH> cyl </TH> <TH> disp </TH> <TH> hp </TH> <TH> drat </TH> </TR>
<TR> <TD align="right"> Mazda RX4 </TD> <TD align="right"> 21.00 </TD> <TD align="right"> 6.00 </TD> <TD align="right"> 160.00 </TD> <TD align="right"> 110.00 </TD> <TD align="right"> 3.90 </TD> </TR>
@@ -264,23 +274,19 @@ knit_hooks$set(par = function(before, options, envir) {
假设我们新造的一个选项叫`par`,它不是**knitr**自带的选项,且跟上面定义的钩子函数同名,那么对下面这个代码段来说,它被执行之前,R会先用`par()`函数设置图形边距参数,因为这是钩子函数定义要执行的任务:
-```
-<<good-margin, par=TRUE>>=
-plot(1)
-@
-```
+ <<good-margin, par=TRUE>>=
+ plot(1)
+ @
注意钩子函数被触发的条件是相应的选项取值非空,所以这里`par`取值`TRUE``FALSE``123`都无所谓。代码段钩子让我们可以把常见的次要任务抽象出来,用一个代码段选项去控制它们的执行。比如上面设定图形边距就是一个非常常见的任务,但要是把这样的代码在每个代码段中的都写一遍的话,就太啰嗦了,而且重复敲代码是大忌!每当你想复制粘贴一段代码的时候都要三思,我真的不需要想办法把这段代码抽象出去吗?
输出钩子用来装裱输出,**knitr**的透明性也体现在这一类钩子上,它可以把R的各类输出都交给用户,让用户决定怎么处理这些输出。所有可能的输出有:源代码、普通文本、警告消息、普通消息、错误消息和图形。每一种有一个对应的钩子函数,这些函数接收R的输出,以一定的形式包装它们,再返回输出来。以源代码为例,它的钩子名为`source`,如果我们定义:
-```
-<<source-hook>>=
-knit_hooks$set(source = function(x, options) {
- paste('\\begin{myEnvironment}', x, '\\end{myEnvironment}')
-})
-@
-```
+ <<source-hook>>=
+ knit_hooks$set(source = function(x, options) {
+ paste('\\begin{myEnvironment}', x, '\\end{myEnvironment}')
+ })
+ @
那么在输出的时候所有R源代码都会被放在`myEnvironment`环境中(当然,你得事先定义好这个环境,不然LaTeX会报错)。钩子函数中,`x`是当前代码段的输出,`options`是所有选项的一个列表。
@@ -308,11 +314,9 @@ knit_hooks$set(source = function(x, options) {
在LyX中输入R代码可以用快捷键`Ctrl + L`,然后按前面介绍的LaTeX类语法写(为什么是LaTeX语法?):
-```
-<<hello-world, echo=FALSE>>=
-print('hello world!')
-@
-```
+ <<hello-world, echo=FALSE>>=
+ print('hello world!')
+ @
事实上**knitr**包的大多数PDF手册都是用LyX写的,读者可以在这里找到它们:

0 comments on commit 5114e0a

Please sign in to comment.