Как я могу изящно закрыть Rserve?

Я пробовал много вариантов как в Mac, так и в Ubuntu. Я прочитал документацию Rserve

http://rforge.net/Rserve/doc.html

а для пакетов Rserve и RSclient:

http://cran.r-project.org/web/packages/RSclient/RSclient.pdf

http://cran.r-project.org/web/packages/Rserve/Rserve.pdf

Я не могу понять, какой правильный рабочий процесс для открытия/закрытия соединения в Rserve и для закрытия Rserve "изящно".

Например, в Ubuntu я установил R из источника с. /config --enable-R-shlib (после документации Rserve), а также добавил строку "control enable" в /etc/Rserve.conf.

В терминале Ubuntu:

library(Rserve)
library(RSclient)
Rserve()
c<-RS.connect()
c ## this is an Rserve QAP1 connection

## Trying to shutdown the server
RSshutdown(c) 
Error in writeBin(as.integer....): invalid connection

RS.server.shutdown(c)
Error in RS.server.shutdown(c): command failed with satus code 0x4e: no control line present   (control commands disabled or server shutdown)

Я могу, однако, ЗАКРЫТЬ соединение:

RS.close(c)
>NULL
c ## Closed Rserve connection

После закрытия соединения я также попробовал параметры (также пытался использовать аргумент 'c', хотя соединение закрыто):

RS.server.shutdown()
RSshutdown()

Итак, мои вопросы:

1 Как можно корректно закрыть Rserve?

2- Может ли Rserve использоваться без RSclient?

Я также посмотрел

Как отключить Rserve(), работающий в DEBUG

но вопрос относится к режиму отладки и также не разрешен. (У меня недостаточно репутации, чтобы комментировать/спрашивать, работает ли shutdown в режиме non-debug).

Также посмотрел:

как подключиться к Rserve с клиентом R

Большое спасибо!

Ответ 1

Загрузите пакеты Rserve и RSclient, затем подключитесь к экземплярам.

> library(Rserve)
> library(RSclient)

> Rserve(port = 6311, debug = FALSE)
> Rserve(port = 6312, debug = TRUE)

Starting Rserve...
 "C:\..\Rserve.exe" --RS-port 6311
Starting Rserve...
 "C:\..\Rserve_d.exe" --RS-port 6312 

> rsc <- RSconnect(port = 6311)
> rscd <- RSconnect(port = 6312)

Похоже, они бегут...

> system('tasklist /FI "IMAGENAME eq Rserve.exe"')
> system('tasklist /FI "IMAGENAME eq Rserve_d.exe"')

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
Rserve.exe                    8600 Console                    1     39,312 K
Rserve_d.exe                 12652 Console                    1     39,324 K

Пусть закрывается.

> RSshutdown(rsc)
> RSshutdown(rscd)

И они ушли...

> system('tasklist /FI "IMAGENAME eq Rserve.exe"')
> system('tasklist /FI "IMAGENAME eq Rserve_d.exe"')

INFO: No tasks are running which match the specified criteria.

Rserve можно использовать без RSclient, запустив его с помощью args и/или config script. Затем вы можете подключиться к нему из какой-либо другой программы (например, Tableau) или с помощью собственного кода. RSclient предоставляет способ передачи команд/данных в Rserve из экземпляра R.

Надеюсь, что это поможет:)

Ответ 2

В системе Windows, если вы хотите закрыть экземпляр RServe, вы можете использовать функцию system в R, чтобы закрыть ее. Например, в R:

library(Rserve)
Rserve() # run without any arguments or ports specified
system('tasklist /FI "IMAGENAME eq Rserve.exe"') # run this to see RServe instances and their PIDs
system('TASKKILL /PID {yourPID} /F') # run this to kill off the RServe instance with your selected PID

Если вы закрыли свой экземпляр RServe с этим PID правильно, появится следующее сообщение:

УСПЕХ: Процесс с PID xxxx завершен.

Вы можете проверить, что экземпляр RServe был закрыт, введя

system('tasklist /FI "IMAGENAME eq Rserve.exe"')

снова. Если экземпляры RServe не запущены, вы получите сообщение

INFO: не выполняются задачи, которые соответствуют указанным критериям.

Дополнительную помощь и информацию по этой теме можно найти в этом связанном вопросе.

Обратите внимание, что подход "RSClient", упомянутый в более раннем ответе, является более аккуратным и более простым, чем этот, но я все равно переносил его для тех, кто запустил RServe, не зная, как остановить его.