寫了一年R,來歸納一下寫R的心得~ R是一門用於統計計算的語言,簡言之,R的優點是統計學家的優點,缺點也是統計學家的缺點XDD
一、R語言的優缺點
1. 優點
- 開源免費:最大的優勢,免錢啦!! 我一開始把他當免費版的matlabXD
- 小而巧:R核心大概50mb左右而已,討厭肥大的軟體~
- 兼容性好:我的電腦linux, mac, windows都有灌R,很方便!
- 無敵多的package:在R的綜合檔案網絡CRAN中提供6000多的package,感覺自己都沒在寫程式,大部分時間都在看package文檔,文檔又寫得很清楚,直接用別人的智慧結晶XD
- 統計、數據分析、機器學習、文本探勘、繪圖:這幾個領域的package尤其豐富,做這些事用R就對了~
- IDE好用:Rstudio真的很讚,沒看過設計這麼好的IDE:)
2. 缺點
- 醜陋的語言:賦值是"<-",初始值是"1"... 語法隨便都可以過,不好抓bug,其實很不符合 "programmer的品味" ..XD
- 效率很糟:萬不得已不要寫for迴圈,還有很多計算速度的陷阱,令人不敢恭維。
- 數據量限制:記憶體管理和平行處理很糟糕,影響到R可以處理的數據規模,通常300mb以上的檔案就要考慮一下R的效率了,硬要優化速度的開發時間倒不如直接寫C比較快..XD
- 部分package不穩定、有版本問題:這算是開源的原罪,尤其處理中文時很容易遇到問題。
二、R語言改善效率的方法
1. apply系列函數 : apply()、*apply()
在R的世界裡寫程式要有向量的思維,在R裡執行單行命令要比用loop快很多,因此當我們需要對矩陣的行或者列逐一計算時,apply()系列函數會提高大量效率。
apply(資料集名稱, 2逐行/1逐列, 套用的函數)
apply()本質上仍然是loop,但它比直接用for要快很多,而且可以簡化程式碼,提升可讀性。
2. R遇上c++ : Rcpp library
現在有了 Rcpp library ,要寫低階語言接到 R 比以前容易很多^^
下面是一個小範例 (優化tf-idf賦值) ,做二維陣列的賦值:
R for loop 版
for(i in 1:nrow(tdm)){ for(j in 1:ncol(tdm)){ MinR[i,j] <- (MinR[i,j] / tf[j]) * idf[i] } }
c++ 版
cppFunction(' NumericMatrix MatrixTFIDF(NumericMatrix x, NumericVector tf, NumericVector idf ) { int nrow = x.nrow(), ncol = x.ncol(); for (int i = 0; i < nrow; i++) { for (int j = 0; j < ncol; j++) { x(i, j) = (x(i, j)/tf(j)) * idf(i); } } return x; } ') MinCpp <- MatrixTFIDF(MinCpp, c(tf), c(idf))
兩者都做10次計算,取平均速度做比較:
options(scipen=100) c(mean(time.r),mean(time.cpp)) barplot(c(mean(time.cpp),mean(time.r)), names.arg=c("C++","R"), cex.names = 1.5, ylab="sec", col = c("lightblue", "mistyrose"), main = "Matrix Computing Time (TF-IDF) in C++ and R" )
速度真是天壤之別啊!!
三、我為什麼喜歡寫R
我喜歡寫c++勝過java,即使我知道java設計比較「優雅」
我喜歡寫R勝過python,即使我知道python設計比較「簡單」
有時候喜歡一個程式語言不需要理由,理由都是事後穿鑿附會上去的..XD
不過真的要說的話..
R is an amazing software interface into the best algorithms : )
References
也談提高R語言的運算效率
http://cos.name/2009/12/improve-r-computation-efficiency/