假设我有两个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)
这个演示视频非常值得.
这是推/拉模型的另一种方法,但您可以使用该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)
我认为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)