Jimmy那些事儿

R语言_自动化

R实现自动化 - knitr 、 rmarkdown

自动化

1
2
3
4
5
install.packages("knitr")
install.packages("rmarkdown")
library(knitr)
library(rmarkdown)

在Tools-Golbal options-Sweave-weave Rnw files using -选择knitr

新建一个Rmd的文件,或者在File-new file-R markdown,新建一个Rmd的文件

现在knitr可以支持多种语言引擎,目前知道的有r,bash,pl,python等。

用knitr动态生成内容

使用一个含有特殊标记的代码块,knitr会运行其中的代码,并抓取该代码的输入,最后把代码的输出作为文档的一部分

1
2
3
​```{r echo=FALSE}
print("hello knitr")
1
2
3
4
5
它将会产生一段内容插入到当前的markdown文件中。如下所示:
```R
#> [1] "hello knitr"

r告诉knitr使用R语言引擎来执行程序,echo=FALSE是knitr能够识别的一个参数,这个意思是,这段代码本身不会出现在最后的文档中。

后面的参数可以控制代码的执行以及输出的格式等,常见的参数有:(多个参数用,分开)

  • eval 是否求值当前代码块
  • echo 是否显示源代码
  • results ‘markup’ ,‘asis’
  • tidy 是否美化R代码
  • fig.width fig.height out.width out.height 设备和输出图片的大小
  • fig.path 输出图片的前缀,如’./rfigures/p123-‘,将生成’./rfigures/p123-…png’
  • include 是否在结果中包含当前块的结果
  • collapse 输出和代码之间是否分开,缺省为“FALSE“,即分开
  • comment 输出前的注释符,缺省为’##’

除了在代码块上指定参数以外,也可以使用ops_chunk$set(tidy=FALSE) 来设置这些参数。如果设定这些参数以后,会在当前文件中一直有效。所以,如果为了使代码块更简单,可以使用这个函数来设置一些参数

另外,knitr中除了每个代码块的参数外,还有包级别的参数,可以使用opts_knit$set(progress=TRUE,verbose=TRUE)这样的方式来设置。常见的包级别参数有:

  • verbose 是否输出更多信息

所有的knitr参数,可以参考这里: http://yihui.name/knitr/options/#package_options

用knitr插入动态表格

在knitr中生成表格,可以使用knitr::kable

1
2
3
​```{r}
knitr::kable(head(iris))
1
2
3
4
5
6
7
8
9
10
11
12
> 注意这里的kable是带有参数的,即**生成html和latex时要用不同的参数调用,因此这个函数不宜直接放在rmd文件中**。最好的方式是使用一个函数来封装这个函数,在封装函数中判定当前的目标格式,然后再利用不同的参数来调用这个函数。在实际的使用中,我用blogtable来封装这个函数,这个函数是这样定义的:
```R
blogtable<-function(x)
{
if(is_latex()) {
knitr::kable(x,format="latex",align="c")
}else{
knitr::kable(x,format="html",table.attr = "class=\"table table-bordered\"", align="c")
}
}

后面的table.attr用来指定表格的css,这样html中生成的每个表格会居中显示。这样,我就可以在我的rmd文件中这样使用它了:

1
2
3
​```{.r}
rwp::blogtable(head(iris))
1
2
3
4
5
6
### 为表格添加标题
kable中有一个参数叫`caption` , 这个参数用来指定表格的标题,现在,我们把这个参数也加到`blogtable`中去。试验一个实例:

aa=c(6223,6220,6210,6205,6213)
bb=letters[1:5]
link=paste0(“http://www.bagualu.net/wordpress/archives/",aa)
rlink=rwp::link(link,bb)
dd=data.frame(link=rlink,index=1:5)
rwp::blogtable(dd,none_escape_column=1,caption=”几篇博文”)

1
2
3
4
5
6
7
8
9
10
11
12
13
## 用knitr插入动态图片
在有图片生成的r块中,用`fig.path`指定图片的前缀。(注意在实际的页面中没有eval=FALSE参数)
```r
​```{r fig.path='rfigures/p5304-',eval=FALSE}
library(rcnmap)
#分别使用红色红色黄色在中国地图上画出湖北,上海和甘肃省
cnmap(c("hubei","shanghai","gansu"),c("red","red","yellow"))

```

生成的图片在rfigures/p5304-unnamed-chunk-2-1.png(相对当前的工作目录)

然后的html中,图的链接为:<img src="rfigures/p5304-unnamed-chunk-2-1.png" title="" alt="" width="672" />

为了让这个图能够在最终的页面中显示出来,你需要把这个图拷贝到适当的地方。

为图片添加标题