1.R語言編程特徵
1.1 R語言數據結構
R語言數據結構其實以數據類型的方式出現,有數據框,數組、向量和矩陣,因子和列表。數據框dataframe是統計專業常用數據集,而因子factor是分類所用的方法,表明了R語言鮮明的經濟統計色彩。向量vector類似一維數組,但是沒有行名和列名,只有標籤names。數組array包括一維數組,二維數組和三維數組和多維數組,三維數組有行、列和層,有行名rownames和列名colnames。矩陣matrix是二維數組,但是具有矩陣計算的性質。列表list不僅具有c語言結構struct的特徵,而且性質是向量,因此是數據結構中的廣義表。
R語言的數據結構中,沒有樹和圖。樹可用靜態數組實現,套用索引方法。而圖在軟體包igraph中提供的函式實現,R語言的圖稱為網路數據格式,所以能分析生物結構和計算機網路。
R語言數據結構有三個屬性:
1.標籤(name),數據結構的每一個元素的標籤是一個字元向量,被稱為賦予名字。
2.維度(dimension),向量沒有維度,數組和矩陣有維度。因此,維度函式dim(x)用來將向量轉換成矩陣和數組。
3.類(class),是面向對象技術的S3對象系統。
1.2 R語言是高級語言
R語言有程式的控制結構和函式function。儘管R語言是解釋型語言,但是可以用編譯的方式實現,調用方法是source(file.R)命令。R語言的軟體包能在編程環境中,通過子選單下載後安裝,因此是無障礙的。現在軟體包有7000多,在統計、數學計算、金融數據分析、生物學、網際網路數據分析,大數據、並行計算,混合編程、數據挖掘、數據分析方面有實際套用。
程式中載入軟體包的命令,
>library(parallel) #並行計算軟體包,單執行緒多核
查找軟體包中所有函式,
>library(help=parallel)
>help(packet=parallel)
R語言和解釋型語言一樣,沒有變數聲明。R語言能編寫c++程式,套用Rcpp軟體包。R語言沒有獨立的標量,僅僅循環語句使用標量作為循環變數。詳細介紹見行業百科的R語言百科 。
1.3 R語言編程風格
統計方式的R語言,稱為數據操作,僅僅是用命令處理數據,將數據分組,參數估計與結果檢驗。金融數據分析,則是建立模型,檢驗模型數據擬合效果,因此數據操作好像沒有明顯的編程意義,實質上沒有明顯的程式風格。
但是,金融數據分析建立模型有標準過程,比如GARCH模型常有最少4個階段或步驟,數據性質、ARCH效應、建立GARCH模型和模型擬合優度的檢測與模型係數和參數調整。因此統計分析仍然有程式標準過程,因此能表現程式設計師的編程能力和特有風格。
計算機專業的R語言,稱為編程的藝術。因子的套用方法、混合編程、並行程式設計、編寫軟體包,都是需要高超的編程技術和鮮明的編程風格,因此不同軟體包的函式的程式運行時間不同。
R語言程式執行時間的函式是system.time(function),參數是系統執行的函式function。
2. R語言程式設計
2.1 R語言編程方法
R語言處理三種問題,1.數據操作。包括統計分析,例如有害健康調查時有多少吸菸的人,分組數據等; 2.金融數據分析,需要建立經濟統計模型,例如建立ARIMA模型; 3.問題處理,譬如數據挖掘、高級語言程式設計、並行計算等。三個問題的編程方法不同。數據操作關鍵是根據每一個命令的結果選擇下一個命令,需要豐富的實際經驗和精明強幹的問題控制能力。輸出命令結果的方法有plot圖,箱式圖等,更高水平是套用高質量報表。高質量報表直觀看和商場pos機的憑條類似,可根據精確的數據進行選擇。建立經濟統計模型的效果根據編程人員的專業能力決定。有時,模型數據擬合效果比較合理,然而不能進行詳細的專業解釋和問題分析,因此不能進一步提高模型的優度,使計算機輔助數據分析的功能受到減弱。建立模型的標準過程在教材和參考書中有分析,但是細節的掌握,表明了工作人員仔細的程度不同,程式的有效性、精確測度就不同。第三個問題是計算機專業人員套用R語言的問題,不僅要求計算機軟體的編程能力和理論套用能力,而且對R語言的掌握有標準 。
2.2 計算機專業掌握R語言的標準
(1)能用R語言程式處理數據框的所有問題,實現分組數據和統計 ,實現數據結構編程,例如樹、圖等。
(2)能用R語言實現並行計算,windows系統的軟體包parallel,Rmpi,snow等,多核和多計算機集群系統。
(3)能用R語言實現混合編程,能實現多核多執行緒。譬如:C/C++,java,python,fortran。
(4)能用R語言處理大量數據。能編寫高性能程式處理幾萬條數據,實現大型資料庫oracle和windows的SQL處理數據.
(5)能用R語言實現圖形界面。R語言是流程式語言,但是很難實現程式的圖形界面。shiny軟體包可實現HTML套用。
(6)能用R語言生成高質量報表。直觀地看R語言報表類似pos機的憑條。
(7)能用R語言程式實現數據挖掘技術,比如k-means,關聯規則等。能用R語言實現hadoop,實現對大數據的處理。
(8)能用R語言實現數據分析,譬如:金融數據分析、生物、會計財務、商業與銷售、電信與通信、交通、醫療、新藥研發以及運輸物流。
2.3 R語言並行計算
並行計算有實際套用的有多核多執行緒,例如python、java、c++,MPI和openMP,R語言軟體包是parallel,Rmpi,snow等,以及GPU計算的CUDA,R語言使用gputools軟體包。R語言並行計算能實現單執行緒多核與集群方式,但是問題是不能實現多核多執行緒,因此要在調用python、java和c++編程環境調用R語言程式。混合編程的程式執行時間是關注的問題,C++處理程式執行時間的函式見下。
1.Linux系統
在程式program1執行前,在命令行用參數time ./progarm1。程式實現方法則是:
#include<sys/time.h> #時間處理頭檔案
#include<stdio.h>
#include<math.h>#數學頭檔案
void functionsample(){#需要執行的函式
unsigned int i,j;
double y;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++)
y=sin((double)i); #計算正弦函式1000000次
}
main(){
struct timeval tpstart,tpend;
float timeuse;
gettimeofday(&tpstart,NULL); #tpstart 開始時間
functionsample(); #執行函式functionsample
gettimeofday(&tpend,NULL); #tpend 結束時間
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+ tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("Used Time:%f\n",timeuse); #float型變數
exit(0);
}
輸出結果: Used Time:0.556070 (參考網際網路文章)
2.windows系統
#include<time.h>
套用函式clock(),類型clock_t,返回程式執行開始到調用此函式間的時間段的毫秒數。clock_t是一個長整型,常量CLOCKS_PER_SEC表示一秒鐘有多少個時鐘計時單元,常量定義見下。
#define CLOCKS_PER_SEC ((clock_t)1000)
example1.計算循環語句的執行時間
int main(){
clock_t startTime, endTime; #定義開始和結束時間
startTime=clock();
for(inti=0;i<1000000;i++)#需要計算執行時間的循環時間
{i++;
}
endTime=clock();
cout<<"TotleTime:"<<(double)(endTime-startTime)/CLOCKS_PER_SEC<<"s"<<endl;
system("pause");
return0;
}
2.4 R 語言編程的高級套用
(1)R語言編寫高質量報表
table是R語言生成統計報表的基礎。我們看到醫學化驗單、影像報表的形式,都是醫學專業、簡潔、數學表示的,R語言的統計和計算特徵與此相似。製作高質量報表被稱為“展示你最好的一面”。在R語言編程環境或RStudio圖形環境下,R Markdown和knitr軟體包可創建數據分析報告。R Mardown提供了簡單語法生成分析報表,包括普通文字、R代碼、以及行內代碼。knitr在此基礎上生成HTML、PDF、word文檔格式的報告,以及幻燈片,並且可在指定位置生成R代碼的執行結果。軟體包knitr和rmarkdown。
library(knitr)
library(rmarkdown)