是否可以在两个R实例之间推/拉变量?

时间:2014-08-04 23:33:14

标签: r

假设我有两个R运行实例。是否存在轻松将变量/数据从一个实例发送到另一个实例的现有解决方案?甚至可能在两个实例之间同步变量的值?

例如,首先两个实例(R1& R2)将以某种方式连接,然后在R1中:

> a <- 12
> push(a)

并且在R2的这一点:

> a
[1] 12

此处的关键字易于使用:尽可能快地(对于用户)以交互方式同步某些变量的值。我将使用Mathematica的RLink在一个R实例中以交互方式工作,并将数据推送到Mathematica的实例/从Mathematica的实例中提取数据。


我意识到这个问题可能听起来很奇怪。我之所以希望存在这样的东西,是因为它对于并行或分布式计算也很有用(这不是我的用例)。

3 个答案:

答案 0 :(得分:16)

看看svSocket。来自:svSocket.pdf

的包装说明
The SciViews svSocket package provides a stateful, multi-client and preemtive socket server.  [...] 

Although initially designed to server GUI clients, the R socket server can also be used to exchange data between separate R processes.

This demo video非常值得。

答案 1 :(得分:8)

这是推/拉模型的另一种方法,但您可以使用bigmemory包来创建存在于共享内存(或磁盘)上的矩阵,该矩阵可以在多个R会话中访问同一台机器:

R会话1

library(bigmemory)
m <- matrix(1:9, 3, 3)
m <- as.big.matrix(m, type="double", backingfile="m.bin", descriptorfile="m.desc")
m
# An object of class "big.matrix"
# Slot "address":
# <pointer: 0x7fba95004ee0>

R会话2

library(bigmemory)
m <- attach.big.matrix("m.desc") 
# Now any changes you make to m will be reflected in both sessions!

这对于使用on矩阵的并行计算也很有用,因为你现在只是将指向矩阵的指针传递给每个生成的R会话,而不是整个 宾语。

由于我们已经创建了一个文件支持的大矩阵,它还允许您创建矩阵,它还允许您创建和操作大于内存的矩阵!

并行示例

library(bigmemory)
library(doMC) # Windows users will need to choose a different parallel backend
library(foreach)
registerDoMC(4) # number of cores (new R sessions to spawn) to run in parallel.

m <- matrix(rnorm(1000*1000), 1000)
as.big.matrix(m, type="double", backingfile="m.bin", descriptorfile="m.desc")
# Just to make sure we don't have any of these objects in memory when we spawn the 
# parallel sessions
rm(m)
gc()

foreach(i = 1:4) %dopar% {
  m <- attach.big.matrix("m.desc")
  # do something!
}

答案 2 :(得分:7)

我认为Redis可以帮助您实现自己想要的目标。 您可以使用R包rredis和/或RcppRedis

在R的第一个实例上你可以做到

library(rredis)
redisConnect()
redisSet("a", 12)
[1] "OK"

然后在第二个R实例上,您可以

library(rredis)
redisConnect()
redisGet("a")
[1] 12