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

Sza*_*lcs 12 r

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

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

> a <- 12
> push(a)
Run Code Online (Sandbox Code Playgroud)

在R2的这一点上:

> a
[1] 12
Run Code Online (Sandbox Code Playgroud)

这里的关键字是易用性:尽可能快地(对于用户)以交互方式同步某些变量的值.我会在Mathematica的RLink中使用它在一个R实例中以交互方式工作,并在Mathematica的实例中推送/拉取数据.


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

flo*_*del 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.
Run Code Online (Sandbox Code Playgroud)

这个演示视频非常值得.

  • 那真是太神奇了.我很高兴被证明完全错了. (4认同)

Sco*_*hie 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>
Run Code Online (Sandbox Code Playgroud)

R会议2

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

这对于使用矩阵的并行计算也很有用,因为您现在只是将指向矩阵的指针传递给每个生成的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!
}
Run Code Online (Sandbox Code Playgroud)


dic*_*koa 7

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

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

library(rredis)
redisConnect()
redisSet("a", 12)
[1] "OK"
Run Code Online (Sandbox Code Playgroud)

然后在第二个R实例上,您可以执行此操作

library(rredis)
redisConnect()
redisGet("a")
[1] 12
Run Code Online (Sandbox Code Playgroud)