2017-11-18 3 views
0

Rのみに依存するWindows上で分散環境を構築しようとしていますので、RserveのRSclientを学習することを選択しました。しかし、私のRSclientは、RS.server.source()コマンドでRserveを制御できません。コマンドRSserverSourceでRserveを制御するにはどうすればよいですか?

私はこれを複数試してみましたが、どれもうまくいかないようです。

1.

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 

私はRserveを開くためにR CMD 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"') 

同様に、shutdownコマンドは、sourceコマンドがエラーを返す間に機能します。

Error images

P.S.

「test.r」が存在することを二重にチェックしましたが、RS.serverコマンドだけを使用したいと思います。ソースまたはRSserverSourceが正常に動作するかどうかを確認するために、シャットダウンコマンドをテストしました。

ネットで長い時間を検索した後、RSserverSourceに関する質問はほとんどありません(唯一の解決策はまだ解決されていません)。助けてください、または達成するためにいくつかのアイデアを与えてください。とても大変です!

答えて

0

私は最近この質問に類似したことをしました。だから、同じ状況に遭遇した人を助けるかもしれないので、私は投稿を書いています。

しかし、他の側のコードを手作業で実行する可能性があります。ですが、私の質問に対する具体的な回答はありません。

接続はsocketConnectionにあり、両側にread.tablewrite.tablefile=connectionと呼んで2台のコンピュータ間でメッセージを転送します。

サーバーポート:

## 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):

1,127.0.0.1 

##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の変数は特定のスレーブの番号であり、第2の変数はホストのIPアドレスであり、分割は,である。

関連する問題