R简介(幻灯片)


刘老师分了个活儿,让我给研二的讲“Introduction to R”,这是《Bayesian Computation with R 》的第一章,既然是书旳一章,所以介绍起来就不能面面俱到,仅仅举了几个R分析的例子。自己很头疼:是全面介绍?时间肯定不够!光讲那几个例子?内容就太干瘪。后来我想,想学R功夫靠自己,因此就给自己设定了这样的目标:首先是一个宏观的把握(比如维基百科上R词条),再就是几个实例,希望能够给他们留下一个印象:R实用、灵活、开放、功能强大!激发大家学R用R的热情,感受R的魅力。R能力提高,不是别人教出来的,是在实践中摸爬滚打出来的!

这是我讲课的幻灯片:A Introduction to R

在做幻灯片的时候,学到了不少东西。最重要的是如何使用R包animation来制作一些图形动画,这些动画包括gif格式的和直接插入网页的。

网页形式的动画有一个好处:在动画下面会有一些命令按钮。通过这些按钮你可以开始、停止、加速、减速动画显示,也可以像幻灯片一样,一张张地展示动画。这些按钮给动画的相关解释,提供了很大的方便。

插入网页形式的动画需要临时加载大量的图片,所以网页打开比较慢。比如说,一个动画由200张图片组成,这样的话,在打开网页时,浏览器就要迅速地加载200张图片,并且,只要你的动画在动,浏览器就要不停地加载图片,这样的网页在本地展示尚可,如果放在远程主机上,就非常“卡”了。在我做的幻灯片中,到第26张时,就会发现动画有点“卡”,不能顺畅的展示(当然,我在上课时,因为是在本地直接打开网页,所以就没有卡的问题了),就是上面的原因。而直接在网页中插入gif动画节财节力,不需要添加css样式以及javascript,与插入一张普通图片一样简单。

下面,简单介绍用R包animation来制作gif格式动画的过程。不出意外,首先我们要加载包”animation”(如果没有安装的话,首先需要安装包)。


library(animation)

加载了包我们就可以使用其中的函数了,为了制作gif动画,用的函数是saveGIF()。下面是帮助文档给出的使用方法:


saveGIF(expr, movie.name = "animation.gif", img.name = "Rplot",  convert = "convert", cmd.fun = system, clean = TRUE, ...)

这个函数中,关键的是第一个参数”expr”,它的功能是告诉R,到底要画那些图,这些需要自己定义,而其他参数默认设置就可以。那么怎么定义expr呢?我们知道,所谓的动画,其实也是由一张张静态图片组成的,我们只不过把这些图片像幻灯片一样“刷刷刷”地显示一遍,就形成了“动画”。定义动画的关键,就是要说明,这些的图片是怎么画出来的,R会自动的把这些图片给串起来,形成一幅动画。因此,expr中就需要定义图片的绘制程序,而大量的图形绘制,我们不能“plot,plot,plot…..”这样一直plot下去,一般我们采用循环结构。我们举一个绘制置信区间的例子,我们首先要定义需要的数据如下:


set.seed(123)
u0 <- 5
sigma0 <- 1
norm.conf.interval <- function(i)
{
  y <- rnorm(16, u0, sigma0)
  n <- length(y)
  z=qt(0.975, n - 1)
  u <- mean(y)
  s <- sd(y)
  ci <- c(u - s * z / n^0.5, u + s * z / n^0.5, (u-u0)/(s/n^0.5))
}
ci <- sapply(1:1000, norm.conf.interval)  #这一部分主要是定义数据,这些我们就不讨论了。

用这套数据我们画了四张图:


par(mfrow = c(2, 2))
for (i in c(1, 50, 100, 200)) {
    plot(0, 1 ,xlim = c(0, 200), ylim = c(3.5,6.5), type = "n");
    col <- (1:2)[(ci[1, 1:i] > 5 | ci[2,1:i] < 5)+ 1] 
    lwd <- (1:3)[(ci[1, 1:i] > 5 | ci[2,1:i] < 5)+ 1] 
    segments(1:i, ci[1, 1:i], 1:i, ci[2,1:i] ,xlim = c(0, 200), ylim = c(3.5,6.5), col = col, lwd = lwd)    
    abline(h = 5, col = 3, lwd = 3)
}

实际上,我们可以画出200张这样的图,随着i的增大,图形慢慢发生了变化,添加的置信区间越来越多。我们的目的,就是想把这200张图组合成一个动画,方法就是把上面的循环绘图程序直接赋值给saveGIF()的第一个参数expr,具体操作如下:


saveGIF({
    for (i in 1:200) {plot(0, 1 ,xlim = c(0, 200), ylim = c(3.5,6.5), type = "n");
    col <- (1:2)[(ci[1, 1:i] > 5 | ci[2,1:i] < 5)+ 1] 
    lwd <- (1:3)[(ci[1, 1:i] > 5 | ci[2,1:i] < 5)+ 1] 
    segments(1:i, ci[1, 1:i], 1:i, ci[2,1:i] ,xlim = c(0, 200), ylim = c(3.5,6.5), col = col, lwd = lwd)    
    ;abline(h = 5, col = 3, lwd = 3)} }
, interval = 0.15)

其中绘图程序包含在“{}”之内,直接作为第一个参数expr的取值。interval指定每两张图片显示的时间间隔,它的值越小,动画显示就越快,值越大,动画显示就越慢。默认的值为1秒,在我们这个问题中,1秒的时间间隔会使动画的显示周期过长(200秒,三分钟!),所以这里我们取的是0.15秒,这样显示更加流畅。程序的运行需要花点时间,这是我程序结果的一部分:


I cannot find ImageMagick with convert = "convert"
but I can find it from the LyX installation: "F:/lyx/imagemagick
Executing: 
"F:\lyx\imagemagick\convert.exe" -loop 0 -delay 15
    C:/Users/lenovo/AppData/Local/Temp/RtmpeGXHBk/Rplot1.png
    C:/Users/lenovo/AppData/Local/Temp/RtmpeGXHBk/Rplot2.png

......
 C:/Users/lenovo/AppData/Local/Temp/RtmpeGXOutput at: C:\Users\lenovo\AppData\Local\Temp\RtmpeGXHBk/animation.gif

“ImageMagick”,我猜,是把图片合并成GIF的一个软件。也就是说,想用saveGIF生成GIF动画,首先安装这个软件。你可能很气愤,到头来还得自己下载其他软件啊?!请你消消气,R是一种统计软件,不要指望他三头六臂,什么都可以干,但它可以综合各种资源,把一些工作程序化,这是他不小的贡献!回到函数,R会把把你要做的图一张张都画出来(Rplot1.png,Rplot2.png…),这里共绘制了200张图(结果我没有全部粘贴),画完后,R会调用ImageMagick把他们合并成GIF动画。最后动画存到哪了呢?看程序最后一行结果: C:\Users\lenovo\AppData\Local\Temp\RtmpeGXHBk/animation.gif,这个很隐秘的地方就是动画的储存结果。当然,不同的电脑可能位置也不一样。下面就是上面的程序生成的动画。


上篇: Latex不同宽度的分栏设置 下篇: 创新基金答辩幻灯片