我们可以使用 testthat 包中的函数来测试向量的元素吗?

Can we use funtions from testthat package to test elements of a vector?

我创建了一个包含函数的包,在本例中是 myfunction(argument1, argument2),它只需要与参数具有相同长度的正输入。我想使用 testthat 包中的函数测试输入的格式是否正确。 这里的重点是我想测试输入是否合格作为函数的参数?

我有类似的东西:

test_that("myfunction works", {
 input1 <- c(200, -220, 250)
 input2 <- c(30, 40, 50)
 myfunction(input1, input2)
 
 expect_equal(length(input1), length(input2))
})

现在我想测试我的所有参数(input1、input2)是否只包含正数。我怎么能那样做? 我实际上试过这个:

expect_true(input1[] > 0)
expect_true(input2[] >0)

expect_gt(input1[], 0)
expect_gt(input2[], 0)

但随后收到一条错误消息:

Error: Result of comparison must be a single logical value

似乎 expect_...() 系列函数仅适用于单个值而不适用于向量或数据框?对我应该尝试什么有什么建议吗?

您的示例有点不寻常,因为通常您会使用测试来检查函数中的 return 值是否满足某些假设,而不是您刚刚指定的输入值。正如它所写的那样,你没有检查任何关于该功能是否真正有效的信息。

话虽如此,您可以使用:

myfunction <- sum

test_that("myfunction works", {
   input1 <- c(200, -220, 250)
   input2 <- c(30, 40, 50)
   myfunction(input1, input2)
   
   expect_true(all(input1>0))
 })
#-- Failure (Line 6): myfunction works ------------------------------------------
#all(input1 > 0) is not TRUE
#
#`actual`:   FALSE
#`expected`: TRUE 

正确地失败了,因为并非所有 input1 都大于零。

作为您通常如何使用期望值的更具体示例,如果您期望对于这些输入,您的函数应该 return 一个数字,并且该值应该是 350,您可以将测试编写为:

myfunction <- sum #The function you're writing

test_that("myfunction works", {
  input1 <- c(200, -220, 250)
  input2 <- c(30, 40, 50)
  
  expect_true(length(myfunction(input1, input2)) == 1) 
  expect_equal(myfunction(input1, input2), 350)
})

This link 关于测试可能是有用的背景知识(虽然它是从包开发的角度编写的,但其中大部分对任何编写代码的人都有用)。特别是12.2给出了一些例子

CRAN 的 biogas 包中的 checkArgClassValue() 函数(未导出)就是用于此类检查的。您可以从这里复制它:https://github.com/sashahafner/biogas/blob/master/R/checkArgClassValue.R。要使您的函数 return 在实际参数不是正数时出错,您可以添加:

checkArgClassValue(input1, expected.class = c('integer', 'numeric'), expected.range = c(0, Inf))

如果您想要警告,只需添加 warn.only = TRUE

请参阅同一存储库的 R 目录中定义的函数,了解如何使用它的其他一些示例。