Можно ли нажать/вытащить переменные между двумя экземплярами R?
Предположим, что у меня два экземпляра R. Существуют ли существующие решения для простой передачи переменных/данных из одного экземпляра в другой? Может быть, даже синхронизировать значения переменной между двумя экземплярами?
Например, сначала два экземпляра (R1 и R2) будут подключены каким-то образом, затем в R1:
> a <- 12
> push(a)
и в этой точке в R2:
> a
[1] 12
Ключевое слово здесь - простота использования: сделайте его как можно быстрее (для пользователя), чтобы интерактивно синхронизировать значение определенных переменных. Я бы использовал это с Mathematica RLink для интерактивной работы в одном экземпляре R и ввода/выталкивания данных в/из экземпляра Mathematica.
Я понимаю, что этот вопрос может показаться странным. Причина, по которой я надеюсь, что что-то вроде этого существует, заключается в том, что это было бы полезно для параллельных или распределенных вычислений (что не является моим прецедентом здесь).
Ответы
Ответ 1
Посмотрите 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.
Это демонстрационное видео действительно стоит того.
Ответ 2
Я думаю, Redis может помочь вам достичь того, чего вы хотите.
Вы можете использовать пакеты R rredis
и/или RcppRedis
В первом экземпляре R вы можете сделать
library(rredis)
redisConnect()
redisSet("a", 12)
[1] "OK"
Затем на втором экземпляре R вы можете сделать
library(rredis)
redisConnect()
redisGet("a")
[1] 12
Ответ 3
Это другой подход к модели push/pull, но вы можете использовать пакет 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!
Это также полезно для параллельных вычислений, использующих на матрицах, поскольку теперь вы только обходите указатель на матрицу на каждую из порожденных сессий 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!
}