如何为 R 包创建具有动态输入的函数?

How to create a function with dynamic input for an R package?

我正在创建一个 R 包。我有一个函数需要用户的一些动态输入才能产生所需的输出。我目前使用 readline() 作为动态输入法。问题是我不知道如何让它同时适用于 roxygen2 examples,也不知道如何使用 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)
}

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

#' @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 和 return 调用,模拟将在测试期间替换 readline 函数“虚拟 return 值模拟函数”。 mockery 还提供了跟踪函数调用的函数,甚至是调用函数时使用的参数。所有非常方便的东西 ;)