分类为'R'的全部存档

Mapping CRAN Mirrors using R

CRAN_mirrors_map
昨天突然想看一下怎么用maps包画地图, 就做了一个CRAN镜像的地理位置数据试了一下. 城市地理位置数据主要来自maps包中的数据集world.cities. 画图时用到了maps和tripack这两个包, maps用于呈现地图, 而tripack可以根据给定点坐标计算并绘制Voronoi图/Delaunay三角剖分. 相比主流的C或C++甚至Python下的实现, 在R中做这种事情可以说是简单无比了. 同时也要慨叹R的扩展性是如此之好. 不过目前R中和计算几何相关的包似乎不多, 据我所知还有rcdd(cddlib在R中的接口)和geometry. 比如geometry包, 可以计算n-维上的Delaunay三角形, 等等. 如果某天哪位大牛可以替最强的计算几何算法库CGAL在R中做一个接口就好了.

CRAN_Mirrors_Voronoi

Voronoi Diagram of CRAN Mirrors on World Map [PDF(Vector), 120KB]

CRAN_Mirrors_Delaunay

Delaunay Triangulation of CRAN Mirrors on World Map [PDF(Vector), 120KB]

从图中看, 多数CRAN镜像分布在沿海地区, 内陆较少, 也极不均匀. 西欧密集分布了约30个镜像, 面积是其几倍大小的东侧大片内陆只有寥寥3、4个镜像. 非洲、南美洲的情况大致相同. 北美的镜像分布呈现比较均匀的态势, 至少看上去比较稳定, 不多也不少.

Dataset & R Code [Gzip, 1,932 bytes]

有两个问题是不得不考虑的:

  1. 地球是椭球体, 在球面上绘制Delaunay三角和Voronoi图, 需要通过计算三维空间中的凸包来实现 .. 但考虑到事实上太平洋中间没有CRAN的镜像, 正好十分自然地将现有镜像隔得很远, 就无视这个了 ..
  2. CRAN镜像发挥的影响力与各地光缆铺设情况的关系更紧密, 这时用地理意义上的世界地图就显得略不给力了 .. 使用能够体现网络分布情况的”地图”才是正解.

Rdonlp2

Rdonlp2包是R中解决非线性规划问题的利器, 其约束条件可为线性的或非线性的. 使用它可以很轻松地求解NLP问题, 几乎是偷懒不想多码代码时的不二选择. Rdonlp2包实际上是Prof. Peter Spellucci的DONLP2在R环境下的一个包装, 但目前似乎Spellucci的主页上写着要求必须写封email才能取得DONLP2. 而Rdonlp2包的作者Ryuichi Tamura在更新到版本0.3-1后也不再公开放出此包的下载. 我在CRAN上翻遍, 一无所获. R-help上还有人说给R包作者发邮件杳无回音云云 .. (谁叫这包从CRAN撤下两年后仍然挂在CRAN Task Views的Optimization页面上呢) 后来, 俺无意中在Rmetrics项目的SVN trunk上找到了此包的源代码. 编译之, 发现由于年代久远, 这包对目前版本的R有点水土不服. 于是上CRAN下了一圈旧发行版, 从R 2.11.x依次递减版本号进行实验, 结论是能够正常运行此包的R最高版本为R 2.6.2.

R对于数据类型的检查随着其版本号的升高而更加严格, 在使用Rdonlp2包求解问题时, 从R 2.7.0版起将出现一个Warning:

Warning message:
In all(lapply(nlin, function(e) is.function(attr(e, “gr”)))) :
coercing argument of type ‘list’ to logical

从R 2.9.0版本开始,除了上面的Warning之外,还会出现一个Error:

Error in tryCatchList(expr, classes, parentenv, handlers) :
SET_VECTOR_ELT() can only be applied to a ‘list’, not a ‘character’

第一个问题源于donlp2.R第59行, 相对比较好解决; 第二个问题则源于Rdonlp2.c, 这文件大约600行吧. 因为我不懂C, 所以希望哪位大侠能够费心手工hack一下, 让它能够在较新的的R版本上正常跑起来. 这里我就偷个懒, 不做任何修改. 直接装个R 2.6.2就可以正常使用啦.

这里放上源码和自己编译的Rdonlp2包.

Package source:     Rdonlp2_0.3-1.tar.gz

Windows binary:     Rdonlp2_0.3-1.zip

编译环境: R 2.6.2 + RTools 2.7 + Win Server 2k3 DataCenter SP2

R 2.6.2下测试通过, 使用时无上述Error和Warning, 加载包时亦无”编译环境版本号高”的Warning.

Read The “Friendly” Manual: http://arumat.net/Rdonlp2/

请注意: DONLP2和Rdonlp2只能用于学习和研究, 商业用途需经作者授权.

放几句英文自勉.

The Six Tenets:

  1. Access to computers – and anything which might teach you something about the way the world works – should be unlimited and total. Always yield to the Hands-On imperative!
  2. All information should be free.
  3. Mistrust authority – promote decentralization.
  4. Hackers should be judged by their hacking, not bogus criteria such as degress, age, race, or position.
  5. You can create art and beauty on a computer.
  6. Computers can change your life for the better.

The Big Bang

Fig 1. Stars

Fig 1. Stars

Fig 2. Seaweeds

Fig 2. Seaweeds

R中的igraph包在处理稍微大一点的数据集时显得乏力, 只好使用专门工具Pajek/Gephi助力.

贝吉塔哥哥去年的一张强图让我一直心向往之, 于是模仿了一个山寨版出来, 就是第一个图了, haha.

第二个图么, 隐约能看出CRAN上R包依赖关系的一个大概. stats/methods/MASS这3个包真的没什么遗憾了 ..

这么看来, “It all started with the big BANG”的说法还真是有点意思.

PDF Version Here.

小径分岔的花园

前天晚上发出一篇质量平平的博文后, 太云学长提出一个建议(其实算是中肯的批评): 用点的大小表示震级的大小. 其实以前也不是没想过这个问题. 只是不怎么懂R中的向量操作, 加上自己比较懒, 所以就 … 昨天没去教室学习(极度堕落啊), 正好宅在寝室里没事, 就画出来玩玩.

我们首先绘制图1, 点的半径大小代表震级的高低. 点的半径越大, 震级越高. (数据附文后)

图1 震级的大小

图1 震级的大小

然后绘制图2, 点的透明度高低代表震源的深度, 点的透明度越靠近完全不透明 (完全不透明的红色为#FF0000FF), 表示震源深度越浅.

图2 震源的深度

图2 震源的深度

继续阅读’小径分岔的花园’

Rapache项目中文镜像

话说这学期开学以后沉寂许久, 博客都落灰了 .. 这些天闲暇时翻译了一下rapache项目的站点, 主体是Manual部分.

rapache

简要介绍

Rapache提供了一个名为mod_R的Apache模块, 相当于在Web服务器中嵌入了R语言解释器的支持. 同时, rapache捆绑了libapreq这个可使Apache处理客户端请求数据的Apache模块. 这样, 二者将R转换为了一种可接受和处理客户端请求的服务器端脚本语言.

作者官网: http://biostat.mc.vanderbilt.edu/rapache/
中文镜像: http://www.road2stat.com/rapache/

译后小结

印象最深的是Manual中4.6小节介绍 sendBin() 函数中的字节序 (endian-ness) 这个参数和后面的大字节序和小字节序的概念, 由于没有相关的专业功底以及原文在写法上的简约, 前后Google几次又斟酌许久才找到比较合适的译法. 另外, 丁国徽老大在《R导论》中似乎将”raw vectors”译为”原味型”向量, 生动体现了原义, 我在这里使用了较为普遍的”原生型”译法, 这是一点不同之处.

继续阅读’Rapache项目中文镜像’

从实例看RgoogleMaps包的使用

写在前面

RgoogleMaps是SenseNetworks公司的Markus Loecher于2009年5月开始编写的一个R包. 此包的用途是把已有坐标数据作为一个个点自动打到从Google Maps上抓取的卫星地图上,好处是省去了人工计算抓取图片的参数和手动抓取、手动调整、打点的麻烦. 换句话说,现在我们只要在R中准备好经纬度数据再调用几个简单的函数就能画出一张 ( 至少从表面上看 ) 比较漂亮的图了 ( 其实也没这么简单 ).

话说敝人有去GIS选修课上睡过几次,奈何所学未有涉及地理专业,叙述方面难免缺失,只要大家能看懂就好了.  :smile:

准备工作

下载安装或读入以下R包:

sp

RgoogleMaps

rgdal (若需生成PNG格式图片)

ReadImages(若需生成JPEG格式图片,还要安装 libjpeg)

接着,前往以下网址申请一个Google Maps的API key. 至于API是什么,我想就不用解释了,不知道的童鞋可以去Google上百度一下.

http://code.google.com/apis/maps/signup.html

Sign_Up_for_Goole_Maps_API图1: Google Maps API 申请页面

阅毕许可协议,勾选 I have read and agree with the terms and conditions 即可获得一个Google Maps的API key. 将此API key(一长串的数字字母符号混合物)写入一个文本文档,保存为:

X:\Documents and Settings\你的用户名\My Documents/API.key.txt

继续阅读’从实例看RgoogleMaps包的使用’