Файлы, не найденные в R при написании пакета: каков правильный подход? - PullRequest
0 голосов
/ 25 апреля 2020

Я пишу пакет R, используя plumber. Основной код:

#' @title startServer
#' @description Start the api server on port `port`
#'
#' @param port Port number
#' @return none
#' @examples
#' startServer(8000)
#' @export
startServer <- function(port) {
  port <- if (port == "")
    port = "8000"

  router_some <- plumber$new("R/some.R")
  router <- plumber$new()
  router$mount("/some", router_some)

  router$run(host = '0.0.0.0',
             port = strtoi(port),
             swagger = TRUE)
}

Этот код работает нормально, если я запускаю его из консоли R:

startServer("8000")
Running plumber API at http://0.0.0.0:8000
Loading required namespace: swagger
Running Swagger UI  at http://127.0.0.1:8000/__swagger__/

Однако всякий раз, когда я запускаю check():

checking examples ... ERROR
  Running examples in ‘...’ failed
  The error most likely occurred in:

  > base::assign(".ptime", proc.time(), pos = "CheckExEnv")
  > ### Name: startServer
  > ### Title: startServer
  > ### Aliases: startServer
  > 
  > ### ** Examples
  > 
  > startServer(8000)
  Error in .subset2(public_bind_env, "initialize")(...) : 
    File does not exist: R/some.R
  Calls: startServer -> <Anonymous> -> <Anonymous>
  Execution halted

файл с маршрутами больше не найден. Как указать на правильный файл (ы)?


Я знаю, что мог бы использовать plumber программно, но, похоже, я потерял правильную генерацию файла чванства (без параметров).

1 Ответ

0 голосов
/ 25 апреля 2020

Я знаю, как работает сборка пакетов, это довольно просто: во время сборки весь код фактически выполняется и сохраняется как R-объекты / структуры. Здесь нам нужно привязать маршрутизатор во время сборки и выставить функцию startServer после завершения. Или: все логики роутера c могут быть выполнены во время сборки. Только запуск сервера (router$run) должен быть в startServer

router_some <- plumber$new("R/some.R")
router <- plumber$new()
router$mount("/some", router_some)

#' @title startServer
#' @description Start the api server on port `port`
#'
#' @param port Port number
#' @return none
#' @examples
#' startServer(8000)
#' @export
startServer <- function(port) {
  port <- if (port == "")
    port = "8000"
  router$run(host = '0.0.0.0',
             port = strtoi(port),
             swagger = TRUE)
}
...