假设我有两个R运行实例。是否存在轻松将变量/数据从一个实例发送到另一个实例的现有解决方案?甚至可能在两个实例之间同步变量的值?
例如,首先两个实例(R1& R2)将以某种方式连接,然后在R1中:
> a <- 12
> push(a)
并且在R2的这一点:
> a
[1] 12
此处的关键字易于使用:尽可能快地(对于用户)以交互方式同步某些变量的值。我将使用Mathematica的RLink在一个R实例中以交互方式工作,并将数据推送到Mathematica的实例/从Mathematica的实例中提取数据。
我意识到这个问题可能听起来很奇怪。我之所以希望存在这样的东西,是因为它对于并行或分布式计算也很有用(这不是我的用例)。
答案 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