Подтвердить что ты не робот

Можно ли нажать/вытащить переменные между двумя экземплярами R?

Предположим, что у меня два экземпляра R. Существуют ли существующие решения для простой передачи переменных/данных из одного экземпляра в другой? Может быть, даже синхронизировать значения переменной между двумя экземплярами?

Например, сначала два экземпляра (R1 и R2) будут подключены каким-то образом, затем в R1:

> a <- 12
> push(a)

и в этой точке в R2:

> a
[1] 12

Ключевое слово здесь - простота использования: сделайте его как можно быстрее (для пользователя), чтобы интерактивно синхронизировать значение определенных переменных. Я бы использовал это с Mathematica RLink для интерактивной работы в одном экземпляре R и ввода/выталкивания данных в/из экземпляра Mathematica.


Я понимаю, что этот вопрос может показаться странным. Причина, по которой я надеюсь, что что-то вроде этого существует, заключается в том, что это было бы полезно для параллельных или распределенных вычислений (что не является моим прецедентом здесь).

4b9b3361

Ответ 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!
}