如何为 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
还提供了跟踪函数调用的函数,甚至是调用函数时使用的参数。所有非常方便的东西 ;)
我正在创建一个 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
还提供了跟踪函数调用的函数,甚至是调用函数时使用的参数。所有非常方便的东西 ;)