2017-02-21 12 views
1

У меня есть большой файл данных, загруженный в память в экземпляре R на одной машине, и я использую Rserve, чтобы разрешить доступ к этим данным от удаленных клиентов. Я хотел бы иметь возможность удаленно вносить изменения в data.frame, например добавление столбца или изменение значения, и я хотел бы, чтобы эти изменения были доступны другим клиентам.Изменение внутренних данных с помощью Rserve

# server side 
> xxx<-data.frame(a=1:3,b=4:6) 
> run.Rserve(port = 6311, ...) 

# client side 
> cc<-RSconnect(port=6311, ...) 
> RSeval(cc,'xxx$c<-7:9') 
> RSeval(cc,'xxx') 
    a b c 
1 1 4 7 
2 2 5 8 
3 3 6 9 

Однако, когда я соединяю со вторым клиентом он не видит изменений:

# another client 
> cc2<-RSconnect(port=6311, ...) 
> RSeval(cc2,'xxx') 
    a b 
1 1 4 
2 2 5 
3 3 6 

Когда сервер остановлен внутренний данные также без изменений. Изменения доступны только клиенту, который их создал, а не тому, что мне нужно.

Есть ли способ сделать эту работу?

+0

Я бы использовал либо базу данных, либо внешний плоский файл для чтения/записи этими отдельными сеансами , С 'data.table'' fread' и 'fwrite' вы не заметите, что предполагаемые данные перегрузки являются разумными. –

+0

Спасибо, я собирался это сделать, но затем я нашел способ сделать это напрямую, используя Rserve (см. Мой ответ ниже). –

ответ

0

Нашел! Ответ был в руководстве для пакета RSclient, просто нужно было перечитать его внимательно.

Способ использования RSserverEval. Эта команда вносит изменения в исходные данные сервера, а не данные, имеющиеся в текущем соединении. Таким образом, клиент, делающий изменения, не может их использовать, а только клиенты, которые подключаются позже. Это немного раздражает, так как сервер выполнит команду и не сможет использовать данные, созданные клиентом, но делает то, что мне нужно. Важно отметить, что сервер должен быть настроен на включение управляющих команд (команда enable в файле конфигурации)