我们可以使用 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 目录中定义的函数,了解如何使用它的其他一些示例。
我创建了一个包含函数的包,在本例中是 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 目录中定义的函数,了解如何使用它的其他一些示例。