2017-02-21 50 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。此命令会更改原始服务器数据,而不是当前连接中可用的数据。因此,进行更改的客户端不能使用它们,只能在稍后连接的客户端使用它们。这有点烦人,因为服务器将执行命令,并且它不能使用客户端创建的数据,但它可以满足我的需求。要注意的是,服务器必须被配置为具有能够使用的控制命令是很重要的(命令在配置文件中启用