【问题标题】:How to create a function with dynamic input for an R package?如何为 R 包创建具有动态输入的函数?
【发布时间】:2021-12-02 13:51:39
【问题描述】:

我正在创建一个 R 包。我有一个功能需要用户提供一些动态输入才能产生所需的输出。我目前使用readline() 作为动态输入法。问题是我不知道如何使它适用于roxygen2examples,也不知道如何使用testthat(或任何其他方法)正确测试它。

如果有更好的方法来获取用户输入,那就太好了。

这是一个与我的函数具有相同问题的最小函数。

#' Dynamic Input Example
#'
#' @param input A number
#'
#' @return Console input times 2 minus 1
#' @export
#'
#' @examples
#' exampler(4)
exampler <- function(input){
  dynamic_input <- as.numeric(readline(prompt=paste("Give a value between", input*3-1, "and", input*7+2)))
  return(dynamic_input*2-1)
}

【问题讨论】:

  • 在您的示例中使用 \dontrun 以使其免于示例测试。可以使用出色的 mockery 包来完成“testthat”测试(它可以在测试期间轻松模拟 readline 函数。

标签: r dynamic r-package


【解决方案1】:

使用此语法可防止函数示例在检查期间运行:

#' @examples \dontrun{interactive_function()}

对于测试套件,我们可以使用以下内容(需要 mockery 包):

test_that("interactive_function works with defaults", {

    mockery::stub(interactive_function, "readline", "dummy return value for mock function")
 
    testvalue <- interactive_function()

    [testcode ...]
 
})

使用该代码,如果 interactive_function 调用了 readline 函数,则 mockery 将在测试期间替换它并返回“模拟函数的虚拟返回值”。 mockery 还提供了跟踪函数调用甚至调用函数时使用的参数的函数。所有非常方便的东西;)

【讨论】:

  • 我知道\dontrun{},但我希望有另一种选择,考虑到稍后提交 CRAN。至于测试,mockery 看起来很整洁,唯一的问题是,它在对readline() 或循环的不同调用中表现如何?
  • 您可以通过模拟返回值列表,它会在后续调用中返回每个条目;)...关于 CRAN:我假设它们对 \dontrun 很好,因为有通常无法解决(CRAN 上的许多软件包都使用 ir)
  • NVM,了解 mock+stub 的工作原理,谢谢!
  • 为了使用“变量返回值”功能,您必须使用另一个 mockery 函数(参见 here
  • 此外,如果您为这项新任务提出另一个问题,则更容易为您提供帮助。不过,我一定会尽力帮助你;)
猜你喜欢
  • 1970-01-01
  • 2021-09-09
  • 2017-11-21
  • 2016-09-08
  • 1970-01-01
  • 2010-11-12
  • 2021-03-12
  • 2022-10-08
  • 1970-01-01
相关资源
最近更新 更多