r语言 - 可以使用testthat包中的函数来测试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_…()家族函数只适用于单个值,而不是矢量或数据帧?有什么建议我应该试试吗?

您的示例有点不寻常,因为通常您会使用测试来检查函数的返回值是否满足某些假设,而不是您刚刚指定的输入值。正如它所写的,你没有检查任何关于函数是否实际工作的东西。

说到这里,你可以用:

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都大于零。

作为通常如何使用期望的更具体的例子,如果您期望这些输入的函数应该返回单个数字,并且该值应该是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)
})

这个关于测试的链接可能是有用的背景(尽管它是从包开发的角度编写的,但它的大部分内容对编写代码的任何人都很有用)。特别是12.2给出了一些例子

CRAN上沼气包中的checkArgClassValue()功能(未导出)用于此类检查。你可以从这里复制:https://github.com/sashahafner/biogas/blob/master/R/checkArgClassValue.R。要使函数在实际参数不为正数时返回错误,可以添加以下内容:

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

如果你想要一个警告,只添加warn.only = TRUE

关于如何使用它的其他示例,请参阅同一repo的R目录中定义的函数。

最新更新