2017-11-18 119 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地址,分割为,