rstudio python_如虎添翼:用Python与C++扩展R语言的应用场景
生活随笔
收集整理的這篇文章主要介紹了
rstudio python_如虎添翼:用Python与C++扩展R语言的应用场景
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
R語言是心理與統計學界中最受歡迎的編程語言之一。相比商業統計軟件,R語言免費、開源、擴展性強;而相比其他開源編程語言,R的基本操作相對簡單,統計與作圖模塊完善,適合進行統計分析工作。
然而,R語言并非沒有劣勢。首先,R程序包的覆蓋范圍沒有那么完美,在有些情況下可能會面臨“無R包可用”的情況。第二,R是一種腳本語言,而且許多底層運算模式沒有針對運算速度做出太多優化。因此,R的運行速度相對較慢,尤其在進行數據量較大的循環運算時,運行時間可能會達到編譯語言的數十倍。R的短處恰恰是其他編程語言的長處。例如,Python作為應用范圍最廣的腳本語言之一,在許多領域有更多的程序包支持;而C++作為一種編譯語言,在進行復雜運算時有明顯的速度優勢。幸好,R語言中提供了與Python和C++的協作程序包。利用這些程序包,我們可以把R處理起來較為困難的部分在另一種程序中運行,之后將運行結果反饋給R,在R中進行下一步分析。當然,為了完成這一任務,對參與協作的另一種語言也需要有一些基礎的了解。Python和C++入門知識超出了本文的范圍,對Python和C++還比較陌生的讀者可以在網上找一些相關的基礎資料。下面,我們會在兩種典型心理學使用場景中介紹R與Python、C++連接的程序包。R與Python的協作:reticulate基本信息reticulate是一個連接R與Python的程序包(官方網站如下)。https://rstudio.github.io/reticulate/我們可以使用這一程序包調用Python模塊的功能。reticulate的安裝方式和其他CRAN程序包一樣,可以直接通過install.packages命令來安裝:install.packages("reticulate")同時,為了調用Python模塊,我們還需要在計算機中裝好Python和需要的模塊,并將Python程序所在目錄放在PATH中。之后,就可以采用reticulate的import功能來導入模塊,并使用“$”符號代替“.”進行Python的面向對象編程。(ps.?這個包的名稱來自于東南亞的一種蟒蛇網紋蟒?reticulated python,估計當時作者為了找一個r開頭的蛇的名字也是費了些心思……)應用示例我曾經遇到過的一個使用場景是這樣:在一個皮膚電研究中,我需要從acq文件里讀取皮膚電信號的源數據,并進行一些后續處理。然而,我只找到了一個可以讀取acq文件的Python包:bioread。因此,我需要借助Python中的bioread包(如下)將數據讀入,之后用R進行下一步處理。https://pypi.org/project/bioread/使用的代碼如下(事先需要安裝Python和bioread包):library(reticulate)bioread "bioread") acqfile $read_file(acqfile # 查看acq文件對象信息# AcqKnowledge file (rev 132): 4 channels, 2000.0 samples/secacqfile$channels # 查看acq文件中的通道# [[1]]# Channel EDA filtered, differentiated: 123787 samples, 2000.0 samples/sec, loaded: True# # [[2]]# Channel EKG - ERS100C: 61893 samples, 1000.0 samples/sec, loaded: True# # [[3]]# Channel RESP - RSP100C: 241 samples, 3.90625 samples/sec, loaded: True# # [[4]]# Channel EDA - GSR100C: 123787 samples, 2000.0 samples/sec, loaded: Trueacqdata1 $channels[[1]]str(acqdata1)# num [1:123787(1d)] -101 -101 -101 -101 -101 ...#可以看到,從Python對象中提取的acqdata1已經是一個R向量了。#因此,之后都可以直接使用R語言對其進行分析#例如:mean(acqdata1)# [1] -110.7604需要注意的是,只有Python中一些特定種類的對象可以被轉換成R語言變量。reticulate官網上給出的對照表如下:因此,對于一些Python模塊中自行定義的對象,需要提取出上述種類的子數據才能繼續用R做處理。(例如,在上述示例中,acqfile是一個AcqKnowledge file對象,不能直接使用R語言進行處理;但acqfile$channels[[1]]$data就是一個常規的數組了,可以直接轉化成R中的向量。)R與C++的協作:Rcpp基本信息Rcpp是最受歡迎的R語言擴展包之一(官方網站如下)。http://www.rcpp.org/我們可以使用這一程序包在R中調用C++函數。Rcpp同樣可以直接通過install.packages命令來安裝:install.packages("Rcpp")同時,我們還需要安裝C++編譯器。對于windows用戶,直接安裝Rtools即可。https://cran.r-project.org/bin/windows/Rtools/index.html要注意的是,使用Rcpp通常需要我們自己寫出一個符合Rcpp要求的C++函數,對編程知識的要求相比reticulate要高一些。應用示例我遇到過的Rcpp使用場景是這樣:我需要做一個心理模型的模擬,其中包含數億次量級的迭代計算。這一工作可以使用R函數實現,但需要的運行時間太長,超出了接受范圍。因此,我將這一函數使用Rcpp重寫。示例代碼如下(為簡明起見,這里使用了一個非常簡單的迭代函數):*add_one_zh.cpp*#include?using?namespace?Rcpp;//在函數開始之前的部分,(#include?,using?namespace?Rcpp;,//[[Rcpp::export]])//是C++和Rcpp需要的一些頭文件。//如果在RStudio中創建新C++文件,RStudio會自動生成這些頭文件。//[[Rcpp::export]]NumericVector add_one(int time) {//這個函數會計算一個向量,其中第一個元素是0,之后每個元素相對上一個元素增加1//注意:C++中的注釋開頭是“//”//C++中,所有變量的類型和函數返回值的類型都需要主動聲明 (例如NumericVector)。//每一句代碼要以分號結束//而且數組序號從0開始//NumericVector是Rcpp中的一種數據類型。//使用這種類型,可以保證函數返回值可以被轉化成R向量。NumericVector x(time+1); x(0) = 0; for(int i = 1; i <= time; i++){ x(i) = x(i-1) + 1; } return x;}*R程序*library(Rcpp)sourceCpp("add_one_zh.cpp") #將Rcpp函數導入R中t1add_one(100000000) # 運行Rcpp函數t2t2-t1 # 計算運行時間# Time difference of 1.545115 secs#相同功能的R函數add_one_slow x){ y "integer", y[1] = 0 for(i in 1:x+1){ y[i] y[i- } return(y)}t1add_one_slow(100000000) # 運行Rcpp函數t2t2-t1 # 計算運行時間# Time difference of 18.90944 secs從運行時間可以看出,本例中實現相同功能的C++函數比R函數快了十倍有余。結語本文對R語言中連接Python和C++的兩個程序包reticulate和Rcpp做了簡單介紹。利用Python和C++的優勢,我們可以擴展R程序可以應用的程序包,加快R語言的運行速度。以上介紹方法只是R語言擴展方式中的很小一個部分,還有許多其他的功能等待大家發現。感興趣的朋友可以參考上述程序包官網上的手冊和相關指導文件。祝大家寫代碼愉快!本文涉及代碼https://github.com/Sciurus365/RPyCpp其他資料Advanced R中Rcpp相關的章節:http://adv-r.had.co.nz/Rcpp.html另一本Rcpp的參考書籍:Rcpp for everyone https://teuder.github.io/rcpp4everyone_en/作者信息:崔競蒙 Radboud University行為科學碩士研究生排版:李昊往期精選
大話Python第2期——基礎入門2
大話Python第1期——Python基礎入門
用R進行多層中介的完整流程:從數據預處理到置信區間的生成
R語言和Jspsych編寫本地和在線心理學實驗和問卷教程
R-studio 中少為人知的秘技
...
總結
以上是生活随笔為你收集整理的rstudio python_如虎添翼:用Python与C++扩展R语言的应用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 治疗输卵管阻塞疼吗
- 下一篇: 千元预算买带集显的处理器,i5 1240