2017-11-18 115 views
0

我想在Windows上建立一個只依賴R的分佈式環境,所以我選擇學習RserveRSclient。但是,我的RSclient無法通過RS.server.source()命令控制Rserve如何通過命令RSserverSource控制Rserve?

我試過了這個的多種變化,但沒有一個似乎工作。

閱讀以下

http://cran.r-project.org/web/packages/RSclient/RSclient.pdf

http://cran.r-project.org/web/packages/Rserve/Rserve.pdf

文件後,我檢查了我的DOS --RS-設置,它表明我的Rserve被使能控制。

>R CMD Rserve --RS-settings 
Rserve v1.7-3 

config file: Rserv.cfg 
Working root: /tmp/Rserv 
port: 6311 
local socket: [none, TCP/IP used] 
authorization required: no 
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 

所以我用R CMD Rserve命令打開我的Rserve。它來源於我的「start.R」,所以我的設置工作。

CMD:

>R CMD Rserve 
[1] "Server start at 2017-11-18 12:55:01" 
Rserve: Ok, ready to answer queries. 

我 「start.R」:

print(paste("Server start at",Sys.time())) 

然後我連接Rserve成功,但RS.server.source()RS.server.shutdown ()不起作用,它們都顯示控制命令被禁用。

system('tasklist /FI "IMAGENAME eq Rserve.exe"') 

library(RSclient) 
c1<-RS.connect(host="172.30.8.40") 

RS.server.source(c1,'E:/RS/test.r') 
RS.server.shutdown(c1) 

RS.close(c1) 

我斷開Rserve並試圖年長命令RSconnect()RSserverSource(),和RSshutdown()

library(RSclient) 
c2<-RSconnect(host="172.30.8.40") 

RSserverSource(c2,'E:/RS/test.r') 
RSshutdown(c2) 

system('tasklist /FI "IMAGENAME eq Rserve.exe"') 

這次RSshutdown的作品,它原來下來我的服務器,但來源仍命令返回錯誤。

Error images

2.我看着invoke rserve from rclient timeout stuck,我試圖在RStudio打開Rserve。這是我的代碼。

library(Rserve) 
library(RSclient) 

Rserve(port=6311,args="--RS-enable-control --RS-enable-remote") 
rsc <- RSconnect(port = 6311) 

system('tasklist /FI "IMAGENAME eq Rserve.exe"') 

RSserverSource(rsc,"E:/RS/test.R") 
RSshutdown(rsc) 

system('tasklist /FI "IMAGENAME eq Rserve.exe"') 

類似地,關斷命令而作品源命令返回錯誤。

Error images

附:

我已經檢查過「test.r」存在,我只想使用命令RS.server。源或RSserverSource,我測試關機命令只是因爲他們也需要我的觀點控制權。

在網絡上搜索了很長時間之後,關於RSserverSource的問題很少(僅有的問題仍未解決)。請幫助或提供一些想法如何實現這一點。非常感謝!

回答

0

我最近在這個問題上做了類似的事情,所以我寫了一篇文章,因爲它可以幫助其他符合相同情況的人。

但是,這只是一個可能的方式來從其他方運行代碼手動,但不是我的問題的具體答案。

該連接以socketConnection爲基礎,我通過在file=connection的每一邊調用read.tablewrite.table在兩臺計算機之間傳輸消息。

服務器端口:

## Init the Environment 

    # Connect Master & Slave 
    con<-list() 
    N<-1   #SlaveNumber 
    cat("#1 try to connect the slaves\n") 
    for (i in 1:N) 
    { 
    #ip<-Ips[i] 
    cat(paste('try to connect slave',as.character(i),'...')) 
    con[[i]] <- socketConnection(port=8000+i, server=TRUE); 
    ty<-read.table(file=con[[i]],nrows=1) 
    if (ty[2] == 1) 
     cat("done\n") 
    } 

##Do something 
    write.table('s,DoSomething',file=con[[1]],col.names = FALSE) 
    #write.table('r,DoSomethingElse',file=con[[2]],col.names = FALSE) 

##Close & Cleaning 
for (i in 1:N) write.table('#',file=con[[i]],col.names = FALSE) 

從端口(S):

##InitSlave 
#load config 
FI<-file('Id.txt',open="r") 
Ids<-readLines(FI,n=1) 
close(FI) 
tmp<-strsplit(Ids[[1]],",") 
tmp<-tmp[[1]] 
#init 
SlaveNum<-as.numeric(tmp[1]) 
HostAdd<-tmp[2] 

#Connection 
ConM <- socketConnection(host=HostAdd, port=8000+SlaveNum, blocking=TRUE); 
write.table(1, file=ConM, col.names = FALSE) 

#Answer command 
Tm<-"A" 
while(Tm[1] != '#') 
{ 
    fit<-try(Tm<-read.table(file = ConM,nrows=1),silent = TRUE) 
    if('try-error' %in% class(fit)) 
    {} else 
    { 
    C<-strsplit(as.character(Tm[1,2]),','); 
    C<-C[[1]] 
    Tm<-C[1] 

    if (Tm == "r") 
    { 
     #Do something 
    } 

    if (Tm == "s") 
    { 
     #Do something else 
    } 

    } 
} 

#Close 
close(ConM) 

隨着工作文件夾中的 「Id.txt」 文件,該文件是這樣的:

1,127.0.0.1 

的第一個變量是特定從站的編號,第二個是主機的IP地址,分割爲,