怪哉怪哉
有意思的R应用示例
以下是我以前写的一个利用鼠标交互选择点的例子,主要是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可以自行调整。

话说这一天,有人给了这么一段代码,据说其本质好像是是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)
运行过代码的同志们没喷血吧?……
语言与软件相比缺点在于,语言的世界对初学者来说太庞大,满眼都是代码,不知从哪儿下手,但是最大的优点也就是灵活性。客官您要是问,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!)。或者您有什么疯狂的主意也赶紧操起键盘联系我。
这是昨天无意间想起来的一个馊主意,鉴于这个主意和统计没什么太大的关系,我也不打算在近期写这样的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)
盯着中间的”+“看几秒之后,就会发现“绕圈”的那个点似乎变成绿色了。
国内关于R的正式网站不多,以前东南大学有R的镜像,但现在看来基本上也已经荒废了,前几天abel介绍了一个在线运行R程序的网站(南京大学地理信息科学系):http://geoinformatics.nju.edu.cn/rphp/r/
我觉得这个挺不错的,以后作演示就方便多了,只要可以上网,就能给别人展示计算和图示结果。
看看人家的网络服务,再看看中国群众大学的网络服务,简直就只能用一个字来形容:太烂了!去年装模作样大搞英文网站建设,估计花了大价钱买了一个网站后台管理系统(这个系统在Firefox下就是废柴),如今已是破败不堪,有时候发不了新闻、有时候改不了模板、有时候添加不了用户,暑假期间还一声不吭弄丢了大量附件(因为这件事情我简直恨死这帮人了),总之要多烂有多烂,还不如开个FTP让各院系自己做网页往上传,管理起来也方便多了,也用不着差劲的网管中心瞎操心;学生上网条件的恶劣就不多说了……说网管中心技术烂也不是冤枉他们,除了擅长整天花大价钱引进烂系统,他们还擅长制作不符合W3C标准的烂网页,那70年校庆的主页被人耻笑了都不知道(Firefox下会错位变形),字体竟然用的是微软雅黑(font-family:Verdana,”微软雅黑”, ?”宋体”, Arial;),服了这帮大爷,眼里只有Windows。本来网络是个很好的教育平台,国外很多大学随便找一个院系网站都做得比人大这些院系要好,只可惜摊上这么个网管中心,看三十年后有没有戏吧。跑题了,打住。
虽说HTML语言简单,而且理论上用cat()函数就足够写文件用了,但我觉得Eric Lecoutre写的这个R2HTML包还是很有价值的,轻轻松松就可以获得漂亮的网页输出。
主要函数:
- HTML():这是个泛型函数(generic function),会根据传入参数的类型(class)自动生成相应的HTML代码。
- HTMLbr():熟悉HTML的人一看就知道,这是换行符”<br>”。
- HTMLhr():同上,这是水平线”<hr>”。
- HTMLInsertGraph():顾名思义,这是插入图片,即”<img src=… >”。
其实比较好玩的是即时生成HTML的两个函数:
- HTMLStart()
- HTMLStop()
它们会记录你在R中的一系列操作,最后用框架页的形式给出类似于日志(log)的报告。

近期评论