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提供瞭解決之道。