首页 > 解决方案 > 编写包时在 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编程方式使用,但是,我似乎失去了适当的招摇文件生成(无参数)。

标签: rr-packageplumber

解决方案


我知道包构建是如何工作的,它非常简单:在构建期间,所有代码实际上都被执行并存储为 R 对象/结构。我们这里需要的是在构建时绑定路由器,并startServer在完成时公开功能。或者:所有路由器逻辑都可以在构建时执行。只有启动服务器(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)
}

推荐阅读