2017-02-21 49 views
1

我在一臺機器上的R實例中將大量數據加載到內存中,並且我正在使用Rserve允許從遠程客戶端訪問此數據。我希望能夠遠程更改data.frame,如添加列或更改值,並且我希望這些更改可供其他客戶端使用。用Rserve更改內部數據

# server side 
> xxx<-data.frame(a=1:3,b=4:6) 
> run.Rserve(port = 6311, ...) 

# client side 
> cc<-RSconnect(port=6311, ...) 
> RSeval(cc,'xxx$c<-7:9') 
> RSeval(cc,'xxx') 
    a b c 
1 1 4 7 
2 2 5 8 
3 3 6 9 

然而,當我與第二客戶端連接它不會看到的變化:

# another client 
> cc2<-RSconnect(port=6311, ...) 
> RSeval(cc2,'xxx') 
    a b 
1 1 4 
2 2 5 
3 3 6 

當服務器停止內部數據也不變。這些更改僅適用於創建它們的客戶端,而不是我真正需要的。

有什麼方法可以使這項工作?

+0

我要麼使用數據的基礎上或外部平面文件要被讀取/由那些不同會話寫入。使用'data.table''fread'和'fwrite'你不會注意到任何過載假設的數據是合理的。 –

+0

謝謝,我打算這樣做,但後來我找到了一種直接使用Rserve的方法(請參閱下面的答案)。 –

回答

0

發現它!答案是在RSclient軟件包手冊中,只是需要仔細閱讀。

要做到這一點的方法是使用RSserverEval。此命令會更改原始服務器數據,而不是當前連接中可用的數據。因此,進行更改的客戶端不能使用它們,只能在稍後連接的客戶端使用它們。這有點煩人,因爲服務器將執行命令,並且它不能使用客戶端創建的數據,但它可以滿足我的需求。要注意的是,服務器必須被配置爲具有能夠使用的控制命令是很重要的(命令在配置文件中啓用