• R语言
  • 简单介绍下在Common Lisp中调用R

前两天去第四届R语言会议,听各位大牛的讲座,讲到了 C, Perl, Excel, Matlab, C++, .Net 等与R的交互。这里我补充一个 Common Lisp中与R的交互方式。

首先试用的Lisp实现是 SBCL , (其他的 CLisp, CCL 等应该也是可以的,我没有尝试).

使用的库是 rcl 。 推荐安装库的方式是通过 quicklisp ,安装很简单:

(ql:quickload "rcl")

安装好后,通过 asdf调入:

(asdf:oos 'asdf:load-op "rcl")

使用:

(use-package :rcl)

(r-init) ;; 首先初始化 R的环境

* (r "seq" 1 5) ; 调用 R的函数

(1 2 3 4 5) ; 返回的结果就是一个标准的Lisp列表

* (r "summary" '(3 5 7 2 9 12 52)) ;; 调用R的函数 , 传入的是一个标准的Lisp列表做参数

(2.0d0 4.0d0 7.0d0 12.86d0 10.5d0 52.0d0)

((:NAMES "Min." "1st Qu." "Median" "Mean" "3rd Qu." "Max.")

(:CLASS "summaryDefault" "table"))

可以看到 R与Common Lisp中的调用,数据交互是很方便的。

整个RCL接口库也很简单,只包含如下的方法:

* (listlib :rcl)

R

R%

R-INIT

WITH-DEVICE

ENABLE-RCL-SYNTAX

=====

实例: 调用R绘图:

<br />
(use-package :rcl)<br />
(r-init)<br />
(enable-rcl-syntax)</p>
<p>(defun plot-1 ()<br />
  (with-device ("/tmp/s0" :png)<br />
    (r "hist"<br />
       (r "rnorm" 100 :mean 10 :sd 1)<br />
       :main "测试Lisp调用R绘图"<br />
       :ylab "数量"<br />
       :xlab "样本")))</p>
<p>(plot-1)<br />


生成的图片见7楼 http://cos.name/cn/topic/104458#post-219590</p>

以后有了更多实际开发经验,再补上些例子。

强烈提议下次R会议 做一篇报告![s:11]

[s:12] 肚子里就这点货都在这了。。。等我实际作出了点东西再分享给大家

增加上文中实例生成的图片

[attachment=219590,1147]

对Lisp不太了解,但听说是由一帮数学家创造出来的,设计的思路非常超前。R里面codetools包有个showTree函数,是把R的表达式转成Lisp的。

library(codetools);<br />
showTree(quote(plot(seq(20), rnorm(20, 0, 2))))


但感觉不是太严格?
</p>

回复 第8楼 的 Ihavenothing: 世人对lisp的误解太深了。 我的观点是:把它当成跟Python之类的语言来用就行了。

R core里的好几位成员原来都是Lisp-Stat的领军人物(如Luke Tierney),而且一度想把Lisp-Stat拯救回来,但R实在是太流行了,如洪水一般淹过了Lisp。不过某种程度上Lisp也算是R的祖宗之一了。

Lisp对R还是有很大的互补性的,特别是符号运算上;个人认为R的未来还需要往Lisp上走。现在的R,符号运算还是太弱了。其实R的基因还是不错的,可能还是没人有空把Lisp那些code转移过来吧。

回复 第11楼 的 remember, discover, invent: 历史大势难以逆转了。所以两个混合起来,发挥两者的优点。