怪哉怪哉

有意思的R应用示例

082010
丰同学建议在《现代统计图形》书稿中插入一些彩蛋,我想第一颗蛋就用这些杂乱无章的彩色点线吧。不过小的实在拿不定哪一幅图看着更“艺术”一些,因此请路人帮忙挑选一下。下图只是众多可能的随机图中的一幅,更多图形请下载查看后面的PDF文件。挑好之后把图中的起始数字告诉小的,小的会在书稿的致谢部分说明您的贡献。

用随机大小和颜色画点

用随机大小和颜色画点

下载全部40页PDF图形文件(2.7Mb)
262009

说去年底Hadley在JSS上把A First Course in Statistical Programming with R这本书批了一顿。建议大家看看书评,我感觉他和作者的私人关系还是很好的,放在国内这种事情大约是不会出现的,不过这小子毫不客气,书写得不好就是不好。

152008

下是我以前写的一个利用鼠标交互选择点的例子,主要是getGraphicsEvent()函数。

文件下载链接

par(bg = "black", mar = rep(0, 4), pch = 20)
xx = runif(100)
yy = runif(100)
plot(xx, yy, type = "n")
mousemove = function(buttons, x, y) {
    r = 0.2
    idx = (x - r < xx & xx < x + r) & (y - r < yy & yy < y + r)
    plot(xx, yy, type = "n")
    rect(x - r, y - r, x + r, y + r, border = "yellow", lty = 2)
    points(xx[idx], yy[idx], col = "yellow", cex = 2)
    points(xx[!idx], yy[!idx], col = "red")
    NULL
}
mousedown = function(buttons, x, y) {
    "Done"
}
getGraphicsEvent("Click mouse to exit", onMouseDown = mousedown,
    onMouseMove = mousemove)

其中r可以自行调整。

062008

话说这一天,有人给了这么一段代码,据说其本质好像是是log-log-log函数的取值范围。

xrange = c(-15, 15)
yrange = c(0, 16)
plot(0, xlim = xrange, ylim = yrange, type = "n")
yr = seq(yrange[1], yrange[2], len = 50)
offsetFn = function(y) {
    2 * sin(0 + y/3)
}
offset = offsetFn(yr)
leftE = function(y) {
    -10 - offsetFn(y)
}
rightE = function(y) {
    10 + offsetFn(y)
}
xp = c(leftE(yr), rev(rightE(yr)))
yp = c(yr, rev(yr))
polygon(xp, yp, col = "#ffeecc", border = NA)
h = 9
xt = seq(0, rightE(h), len = 100)
yt = log(1 + log(1 + log(xt + 1)))
yt = yt - min(yt)
yt = h * yt/max(yt)
x = c(leftE(h), rightE(h), rev(xt), -xt)
y = c(h, h, rev(yt), yt)
polygon(x, y, col = "red", border = NA)

运行过代码的同志们没喷血吧?……

252008

言与软件相比缺点在于,语言的世界对初学者来说太庞大,满眼都是代码,不知从哪儿下手,但是最大的优点也就是灵活性。客官您要是问,R语言能做什么呢?据我所知的话,答案应该是计算机世界的几乎任何事情。比如,今天看见UC Davis的Duncan Temple Lang为R写了一个特别的包,叫RGoogleDocs,它可以用来读、写、上传、删除Google Docs

顺便提一下,他写的RCurl包可以用来获取或发送HTML表单(form),有了操纵表单的功能之后也就意味着,网络上大部分交互式操作都可以从R里面完成了,比如登录网站、提交日志、上传文件等等。

许久以来我想利用Socket连接写一个即时聊天的包,不过至今没有发布,其实实现起来不过二十来行代码,用base里面的socketConnection()函数以及读写Socket的read.socket() & write.socket()就可以完成了。我有一次在办公室两台电脑上测试了一下,嘿,还真可以。这件事情要是能结合Simon Urbanek的Rserve包来做的话就更完美了,不仅可以聊文本,还可以传文件,要是再加上tcl/tk或者RGTK包来做一个界面的话,那就完全胜似QQ、MSN了,等等。感兴趣的客官要是哪天把这个想法在R里面实现了一定通知我一声(比如写了一个包叫作RICQ,意即Ah, I seek you!)。或者您有什么疯狂的主意也赶紧操起键盘联系我。

十二 222007

是昨天无意间想起来的一个馊主意,鉴于这个主意和统计没什么太大的关系,我也不打算在近期写这样的R包。不过我相信做出来之后还是会吸引一些眼球的,就像R里面的数独sudoku包一样,和统计也没太大关系,但把它写出来供娱乐用也颇有点意思。

比如这里我可以提供我昨天随意写的一段光学幻象代码:

文件下载链接

# By Yihui XIE, Dec 22, 2007 www.yihui.name
op = par(bg = "gray", mar = rep(2, 4), xpd = NA)
x = seq(0, 2 * pi, length = 16)
invisible(replicate(100, {
    for (i in 1:length(x)) {
        plot(1, xlim = c(-1, 1), ylim = c(-1, 1), axes = F, ann = F,
            type = "n")
        points(sin(x[-i]), cos(x[-i]), col = "magenta", cex = 7,
            pch = 19)
        points(0, 0, pch = "+", cex = 5, lwd = 2)
        Sys.sleep(0.05)
    }
}))
par(op)

盯着中间的”+“看几秒之后,就会发现“绕圈”的那个点似乎变成绿色了。

012007

内关于R的正式网站不多,以前东南大学有R的镜像,但现在看来基本上也已经荒废了,前几天abel介绍了一个在线运行R程序的网站(南京大学地理信息科学系):http://geoinformatics.nju.edu.cn/rphp/r/

我觉得这个挺不错的,以后作演示就方便多了,只要可以上网,就能给别人展示计算和图示结果。

看看人家的网络服务,再看看中国群众大学的网络服务,简直就只能用一个字来形容:太烂了!去年装模作样大搞英文网站建设,估计花了大价钱买了一个网站后台管理系统(这个系统在Firefox下就是废柴),如今已是破败不堪,有时候发不了新闻、有时候改不了模板、有时候添加不了用户,暑假期间还一声不吭弄丢了大量附件(因为这件事情我简直恨死这帮人了),总之要多烂有多烂,还不如开个FTP让各院系自己做网页往上传,管理起来也方便多了,也用不着差劲的网管中心瞎操心;学生上网条件的恶劣就不多说了……说网管中心技术烂也不是冤枉他们,除了擅长整天花大价钱引进烂系统,他们还擅长制作不符合W3C标准的烂网页,那70年校庆的主页被人耻笑了都不知道(Firefox下会错位变形),字体竟然用的是微软雅黑(font-family:Verdana,”微软雅黑”, ?”宋体”, Arial;),服了这帮大爷,眼里只有Windows。本来网络是个很好的教育平台,国外很多大学随便找一个院系网站都做得比人大这些院系要好,只可惜摊上这么个网管中心,看三十年后有没有戏吧。跑题了,打住。

292007

HTML语言简单,而且理论上用cat()函数就足够写文件用了,但我觉得Eric Lecoutre写的这个R2HTML包还是很有价值的,轻轻松松就可以获得漂亮的网页输出。

主要函数:

  • HTML():这是个泛型函数(generic function),会根据传入参数的类型(class)自动生成相应的HTML代码。
  • HTMLbr():熟悉HTML的人一看就知道,这是换行符”<br>”。
  • HTMLhr():同上,这是水平线”<hr>”。
  • HTMLInsertGraph():顾名思义,这是插入图片,即”<img src=… >”。

其实比较好玩的是即时生成HTML的两个函数:

  • HTMLStart()
  • HTMLStop()

它们会记录你在R中的一系列操作,最后用框架页的形式给出类似于日志(log)的报告。

WWW.YIHUI.NAME XIE@YIHUI.NAME © 2007 - 2010 by Yihui Xie