R語言做爲統計學一門語言,一直在小衆領域閃耀着光芒。直到大數據的爆發,R語言變成了一門煊赫一時的數據分析的利器。隨着愈來愈多的工程背景的人的加入,R語言的社區在迅速擴大成長。如今已不單單是統計領域,教育,銀行,電商,互聯網….都在使用R語言。 java
要成爲有理想的極客,咱們不能停留在語法上,要掌握牢固的數學,機率,統計知識,同時還要有創新精神,把R語言發揮到各個領域。讓咱們一塊兒動起來吧,開始R的極客理想。 linux
關於做者: 程序員
轉載請註明出處:
http://blog.fens.me/r-rserve-rsclient/ 算法
前言 服務器
RSclient是實現Rserve通訊的R語言客戶端程序,對於統計人員使用RSclient調用Rserve運行R語言腳本,感受會很奇怪。但對於實際應用架構來講倒是頗有幫助的,不只能夠統一Rserve的接口,還能夠從架構上實現R語言的跨虛擬機的分步式程序設計。 架構
目錄 異步
Rserve介紹 socket
Rserve是一個基於TCP/IP協議的,容許R語言與其餘語言通訊的C/S結構的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供遠程鏈接,認證,文件傳輸等功能。咱們能夠設計R作爲後臺服務,處理統計建模,數據分析,繪圖等的任務。 tcp
Rserve的使用請參考文章:R語言服務器程序 Rserve詳解, Rserve與Java的跨平臺通訊 函數
RSclient介紹
RSclient是Rserve客戶端的R語言實現,經過RSclient能夠訪問Rserve服務器實例。
官方介紹:http://www.rforge.net/RSclient/
服務器系統環境
啓動Rserve服務器
~ R CMD Rserve ~ ps -aux|grep Rserve conan 28339 0.0 1.2 116292 25240 ? Ss 22:31 0:00 /usr/lib/R/bin/Rserve ~ netstat -ntlp|grep Rserve tcp 0 0 0.0.0.0:6311 0.0.0.0:* LISTEN 28339/Rserve
Rserve環境
~ R CMD Rserve --RS-settings Rserve v1.7-1 config file: /etc/Rserv.conf working root: /tmp/Rserv port: 6311 local socket: [none, TCP/IP used] authorization required: yes plain text password: allowed passwords file: [none] allow I/O: yes allow remote access: yes control commands: yes interactive: yes max.input buffer size: 262144 kB
客戶端環境,遠程訪問
RSclient安裝和加載
~ R > install.packages("RSclient") > library(RSclient)
RSclient的API分爲兩組,Rclient(舊版本)和RCC(新版本)。
Rclient 舊版本API:函數名是大小寫連寫的
RSassign RSattach RSclose RSconnect RSdetach RSeval RSevalDetach RShowDoc RSiteSearch RSlogin RSserverEval RSserverSource RSshutdown RSclient::
RCC 新版本API:函數名以.分隔的
RS.assign RS.authkey RS.close RS.collect RS.connect RS.eval RS.eval.qap RS.login RS.oobCallbacks RS.server.eval RS.server.shutdown RS.server.source RS.switch
我主要介紹新版本API的使用
客戶端操做函數
服務器管理函數:Rserve啓動時,須要設置–RS-enable-control
~ R > library(RSclient) #創建鏈接 > conn<-RS.connect(host="192.168.1.201") > conn Rserve QAP1 connection 0x000000000445cd60 (socket 308, queue length 0) #登錄認證 > RS.login(conn,"conan","conan",authkey=RS.authkey(conn)) [1] TRUE #執行腳本 > RS.eval(conn,rnorm(5)) [1] -2.6762608 1.4435144 -0.4298395 -0.7046573 -1.4056073 #設置變量 > RS.assign(conn,"xx",99) raw(0) > RS.eval(conn,xx-55) [1] 44 #同步執行 > RS.eval(conn,head(rnorm(10000000)),wait=TRUE) [1] -4.20217390 0.22353317 -1.70256992 0.30053213 -0.01427486 -0.70522254 #異步執行 > RS.eval(conn,head(rnorm(10000000)),wait=FALSE) NULL > RS.collect(conn) [1] -0.2814752 0.3215521 -1.0978825 -0.8534461 -0.2459560 -0.4804882 #關閉鏈接 > RS.close(conn) NULL > conn Closed Rserve connection 0x000000000445cc80
客戶端A
~ R library(RSclient) conn<-RS.connect(host="192.168.1.201") RS.login(conn,"conan","conan",authkey=RS.authkey(conn)) RS.assign(conn,"A",1234) > RS.eval(conn,A) [1] 1234 > RS.eval(conn,getwd()) [1] "/tmp/Rserv/conn29039"
客戶端B
~ R library(RSclient) conn<-RS.connect(host="192.168.1.201") RS.login(conn,"conan","conan",authkey=RS.authkey(conn)) RS.assign(conn,"B",5678) > RS.eval(conn,B) [1] 5678 > RS.eval(conn,ls()) [1] "B" > RS.eval(conn,getwd()) [1] "/tmp/Rserv/conn29040"
咱們看到A,B兩個客戶端創建接口後,服務器端的Rserve會在兩個單獨的空間運行。所以,A,B兩個客戶端的訪問是獨立的。
在客戶端A,設置服務器全局變量
> RS.server.eval(conn, "G<-999") : command failed with status code 0x48: access denied
注:出現拒絕訪問的錯誤,雖然咱們已經打開了--RS-enable-control,仍是有錯誤,不知道是否是Rserve的bug。
經過RSclient,咱們就能夠遠程鏈接Rserve。若是你們發散一下想法,就能夠經過Rserve和RSclient構建一個純R的分步式計算環境。下篇文章我將模擬構建一個這樣的環境!!