R是一门主要用于统计分析、绘图的语言和环境,是S语言的一种实现,但R的语法倒是来自Scheme,是一种面向对象、支持反射的函数式脚本语言。php
R原本是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发,随即成为GNU的项目之一,如今由R开发核心团队''负责开发。R如今支持多种平台,包括GNU/Linux、FreeBSD、Windows和MacOS。html
与其它商业统计软件不一样,R主要的用户交互接口是R解析器。用户能够与R如同与shell通常灵活交互,也能够经过脚本向R提交做业。R提供 libR.so共享对象,开发者能够设计GUI前端并与之链接,这样既可以提供R解析器接口又能提供丰富的菜单功能和其它做业方式。前端
在*nix上,vim和(x)emacs是著名的两大编辑器,相应地,开发者提供了R的交互支持:git
ESS (Emacs Speaks Statistics)github
Vim-rweb
做为KDE桌面的原生程序,RKWard提供了良好的IDE体验!
shell
这里咱们推荐读者参考R的官方参考手册。vim
为何要使用R?撇开R是自由软件不说,还有如下缘由:oracle
R逐渐成为统计软件的事实标准,在不少方面已经遇上甚至超越SAS和SPSS等商业软件。 编辑器
R的语法简答而清晰
R的效率很高(主要取决于BLAS的实现)
CRAN有丰富的扩展包
除了原生的C接口,R还有良好的语言绑定,如C++,Java,方便用户设计本身的计算敏感的程序
R支持OpenMP和OpenMPI等并行基础,适合计算敏感的场合
在上文说起了R有良好的语言绑定,其中扩展包Rcpp方便用户使用C++来开发扩展。咱们使用Rcpp开发了两个实验性的项目RcppKmeans和RcppNaiveBayes,用于数据挖掘的研究。
显然,咱们须要安装Rcpp,注意确保GCC和R的开发环境是完备的:
install.packages("Rcpp")
转移到你的工做目录
library(Rcpp) Rcpp.package.skeleton("MyProjectName")
OK! MyProjectName的骨架建好了,开始写代码!等等,建议按照目录里的Read-and-delete-me的指示走一遍。
为一简单的用于文本的kmeans聚类器,经过应用OpenMP技术,在多核平台上利用并行带来的优点。
git clone git://github.com/ucweb/RcppKmeans.git R CMD INSTALL RcppKmeans
1 library(RcppKmeans) 2 # 9 个点 3 s <- list( 4 c("a", "a", "b", "b" ), 5 c("b", "b", "a", "c"), 6 c("e", "e", "f", "f"), 7 c("t", "t", "f", "f"), 8 c("s", "t", "h", "f"), 9 c("s", "t", "h", "f"), 10 c("s", "t", "h", "f"), 11 c("s", "t", "h", "f"), 12 c("s", "h", "t", "f")) 13 Kmeans(s,4L,1e3L,0.25)
输出:
$clusters $clusters[[1]] [1] 7 4 5 6 8 $clusters[[2]] [1] 1 0 $clusters[[3]] [1] 2 $clusters[[4]] [1] 3 $iterations [1] 2 $divergent integer(0)
输出结果说明:
c("a", "a", "b", "b" )和 c("b", "b", "a", "c")被纳入第二个聚类,c("e", "e", "f", "f")和c("t", "t", "f", "f")被孤立,而剩余的则纳入第一个聚类。
为一简单的用于文本的分类器,自己不该用并行技术,但提供的接口能够与Rmpi一同使用,从而实现并行处理。
git clone git://github.com/ucweb/RcppNaiveBayes.git R CMD INSTALL RcppNaiveBayes
1 library(RcppNaiveBayes) 2 3 a <- list(c("A", "B", "B", "D", "A", "Z"), 4 c("C", "B", "C", "Z", "H")) 5 b <- list(c("A", "F", "Y", "F", "W"), 6 c("I", "A", "G", "F", "P", "D"), 7 c("G", "A", "N", "P")) 8 d <- list(c("Y", "D", "P"), 9 c("H", "H"), 10 c("Z", "Z")) 11 m <- NaiveBayesTrain(list(a,b)) # 训练两个类别 12 NaiveBayesPredict(m, d)
输出:
$scores $scores[[1]] [1] 0.1000000 0.2666667 $scores[[2]] [1] 0.40000000 0.06666667 $scores[[3]] [1] 0.90000000 0.06666667 $predicted [1] 2 1 1 attr(,"class") [1] "RcppNaiveBayesPredict"
输出结果说明:
$predicted的值为d各元素被纳入的类别,即c("Y", "D", "P")以分值0.2666667>0.1000000而纳入类别b;同理,c("Z", "Z")被纳入类别a。
R是一门十分容易掌握的语言,加之扩展的便捷开发,它迅速在计算相关领域日益获得重视,不少企业级的应用也有R的一席之地。然而R并不是万能,加之并行计算并无统一模式,以及数据规模的爆炸性增加给予R的in-memory计算方式极大的冲击。若是要将R应用于大数据领域,那么还有一段路要走,尽管商业方案的RevoScale提供了解决之道。