共計 2490 個字符,預計需要花費 7 分鐘才能閱讀完成。
R 語言及其擴展的開發是怎樣的,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
簡介
R 是一門主要用于統計分析、繪圖的語言和環境,是 S 語言的一種實現,但 R 的語法卻是來自 Scheme,是一種面向對象、支持反射的函數式腳本語言。
R 本來是由來自新西蘭奧克蘭大學的 Ross Ihaka 和 Robert Gentleman 開發,隨即成為 GNU 的項目之一,現在由 R 開發核心團隊 負責開發。R 現在支持多種平臺,包括 GNU/Linux、FreeBSD、Windows 和 MacOS。
作業環境
與其它商業統計軟件不同,R 主要的用戶交互接口是 R 解析器。用戶可以與 R 如同與 shell 一般靈活交互,也可以通過腳本向 R 提交作業。R 提供 libR.so 共享對象,開發者可以設計 GUI 前端并與之連接,這樣既能夠提供 R 解析器接口又能提供豐富的菜單功能和其它作業方式。
在 *nix 上,vim 和 (x)emacs 是著名的兩大編輯器,相應地,開發者提供了 R 的交互支持:
ESS (Emacs Speaks Statistics)
Vim-r
作為 KDE 桌面的原生程序,RKWard 提供了良好的 IDE 體驗!
使用
這里我們推薦讀者參考 R 的官方參考手冊。
為什么使用 R
為什么要使用 R?撇開 R 是自由軟件不說,還有以下原因:
R 逐漸成為統計軟件的事實標準,在很多方面已經趕上甚至超越 SAS 和 SPSS 等商業軟件。
R 的語法簡答而清晰
R 的效率很高(主要取決于 BLAS 的實現)
CRAN 有豐富的擴展包
除了原生的 C 接口,R 還有良好的語言綁定,如 C ++,Java,方便用戶設計自己的計算敏感的程序
R 支持 OpenMP 和 OpenMPI 等并行基礎,適合計算敏感的場合
編寫擴展
在上文提及了 R 有良好的語言綁定,其中擴展包 Rcpp 方便用戶使用 C ++ 來開發擴展。我們使用 Rcpp 開發了兩個實驗性的項目 RcppKmeans 和 RcppNaiveBayes,用于數據挖掘的研究。
創建基于 Rcpp 擴展
顯然,我們需要安裝 Rcpp,注意確保 GCC 和 R 的開發環境是完備的:
install.packages(Rcpp)
轉移到你的工作目錄
library(Rcpp)
Rcpp.package.skeleton(MyProjectName)
OK! MyProjectName 的骨架建好了,開始寫代碼!等等,建議按照目錄里的 Read-and-delete-me 的指示走一遍。
RcppKmeans
為一簡單的用于文本的 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) 被孤立,而剩余的則歸入第一個聚類。
RcppNaivebayes
為一簡單的用于文本的分類器,本身不應用并行技術,但提供的接口可以與 Rmpi 一同使用,從而實現并行處理。
安裝
git clone git://github.com/ucweb/RcppNaiveBayes.git
R CMD INSTALL RcppNaiveBayes
示例
1 library(RcppNaiveBayes)
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 提供了解決之道。
關于 R 語言及其擴展的開發是怎樣的問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。