如何通过命令RSserverSource控制Rserve?
我想在Windows上建立一个只依赖R的分布式环境,所以我选择学习Rserve和RSclient。但是,我的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的作品,它原来下来我的服务器,但来源仍命令返回错误。
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"')
类似地,关断命令而作品源命令返回错误。
附:
我已经检查过“test.r”存在,我只想使用命令RS.server。源或RSserverSource,我测试关机命令只是因为他们也需要我的观点控制权。
在网络上搜索了很长时间之后,关于RSserverSource的问题很少(仅有的问题仍未解决)。请帮助或提供一些想法如何实现这一点。非常感谢!
我最近在这个问题上做了类似的事情,所以我写了一篇文章,因为它可以帮助其他符合相同情况的人。
但是,这只是一个可能的方式来从其他方运行代码手动,但不是我的问题的具体答案。
该连接以socketConnection
为基础,我通过在file=connection
的每一边调用read.table
和write.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地址,分割为,
。