Выйдите из API сантехника, как только условие выполнено - PullRequest
1 голос
/ 26 июня 2019

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

Я указал условие в конечной точке @get, которое вызывает quit (), stop () и т. Д., Но ни одно из них не привело к успешному завершению работы API.

Я пытался запустить API параллельно, используя в будущем, чтобы родительский скрипт мог закрыть API-интерфейс Plumber.

Похоже, что на самом деле в объекте класса Plumber API нет метода для закрытия API-интерфейса Plumber, и API не может быть закрыт изнутри.

Я изучил расширенную документацию, SO и Github Issues в поисках решения. Единственное предложенное частично релевантное решение - использовать R.Utils :: withTimeout для создания ограниченного по времени тайм-аута. Однако этот метод также не может закрыть API.

Простой вариант использования: Основной сценарий:

library(plumber)
code_api <- plumber::plumb("code.R")
code_api$run(port = 8000)

code.R


#' @get /<code>
function(code) {
  print(code)
  if (nchar(code) == 3) {
    assign("code",code,envir = globalenv())
  quit()}
  return(code)
}
#' @get /exit
function(exit){
  stop()
}

Входные данные успешно возвращены в глобальную среду, но API не завершает работу ни после этого, ни после вызова конечной точки / exit.

Есть идеи, как этого добиться?

1 Ответ

0 голосов
/ 25 июля 2019

Вы можете посмотреть на Итеративное тестирование с сантехником @ Irène Steve's, 23 декабря 2018 с:

  • trml <- rstudioapi::terminalCreate()
  • rstudioapi::terminalKill(trml)

выдержка из ее статьи (2-я версия 3):

.state <- new.env(parent = emptyenv()) #create .state when package is first loaded

start_plumber <- function(path, port) {
    trml <- rstudioapi::terminalCreate(show = FALSE)
    rstudioapi::terminalSend(trml, "R\n") 
    Sys.sleep(2)
    cmd <- sprintf('plumber::plumb("%s")$run(port = %s)\n', path, port)
    rstudioapi::terminalSend(trml, cmd)

    .state[["trml"]] <- trml #store terminal name
    invisible(trml)
}

kill_plumber <- function() {
    rstudioapi::terminalKill(.state[["trml"]]) #access terminal name
}
...