如何检查用户定义的函数在r中是否有效?

时间:2016-07-13 13:13:18

标签: r function

这可能是一个非常愚蠢的问题,但我如何检查自己编写的函数是否有效?

我正在编写一个涉及许多其他函数和循环的非常简单的函数,并且想知道是否有任何方法可以检查错误/错误,或者只是检查函数是否可行。我只是创建一个简单的假数据框并对其进行测试吗?

正如评论中其他用户所建议的那样,我添加了我编写的函数部分。所以基本上我有一个包含好坏数据的数据框,坏数据用标记标记。我想编写一个函数,当用户将flag.option设置为1时,允许我像往常一样生成绘图(使用标记点),并在用户将flag.option设置为0时从绘图中删除标记点。

AIR.plot <- function(mydata, flag.option) {
if (flag.option == 1) {
par(mfrow(2,1))
conc <- tapply(mydata$CO2, format(mydata$date, "%Y-%m-%d %T"), mean)
dates <- seq(mydata$date[1], mydata$date[nrow(mydata(mydata))], length =     nrow(conc))
plot(dates, conc,
     type = "p",
     col = "blue",
     xlab = "day",
     ylab = "CO2"), error = function(e) plot.new(type = "n")
barplot(mydata$lines, horiz = TRUE, col = c("red", "blue")) # this is just a   small bar plot on the bottom that specifies which sample-taking line (red or  blue) is providing the samples
} else if (flag.option == 0) {
# I haven't figured out how to write this part yet but essentially I want to  remove all
# of the rows with flags on
}
}

在此先感谢,我还不是一位经验丰富的R用户,所以请帮助我。

2 个答案:

答案 0 :(得分:3)

在我们(​​意思是在我的工作场所)向我们的生产环境发布任何代码之前,我们会运行一系列测试程序,以确保我们的代码按照我们希望的方式运行。它通常涉及几个对代码有不同看法的人。

理想情况下,此类验证应在您编写任何代码之前开始。您应该能够回答的一些问题是:

  1. 代码应该做什么?
  2. 它应接受哪些输入? (包括类型,范围等)
  3. 输出应该是什么样的?
  4. 如何处理缺失值?
  5. 它将如何处理NULL值?
  6. 它如何处理零长度值?
  7. 如果准备一份要求列表在开始编写任何代码之前编写文档,那么成功的可能性就会很快上升。当然,在开始编写代码时,您可能会发现需要调整需求,或者需要修改函数参数。没关系,但在发生这些变化时记录

    在编写函数时,使用assertthatcheckmate这样的包在代码中编写所需数量的参数检查。我工作的一些最好,最可靠的代码包括大约100行参数检查和3-4行代码实际上要做的事情。这似乎有点矫枉过正,但是你可以防止因用户提供的错误输入而导致的许多问题。

    当您完成函数编写之后,您应该在此处列出需求明确记录您的参数期望。这是您使用testthat包的地方。

    • 编写用于验证您编写的所有要求的测试。
    • 编写测试,验证您无法输入非预期的输入并获得所需的结果。
    • 编写测试,验证您是否获得了预期的测试数据输出。
    • 编写测试,测试您能想到的任何边缘情况。

    编写所有这些测试可能需要很长时间,但一旦完成,任何进一步的开发都更容易检查,因为任何违反现有要求的内容都将无法通过测试。

    话虽这么说,我在自己的工作中非常难以遵循这个过程。我倾向于编写代码,然后记录我所做的事情。但是我编写的最好的代码是我在概念上计划出来的,写了我的文档,编码,然后根据我的文档进行测试。

答案 1 :(得分:1)

正如@ antoine-sac在链接中指出的那样,有些东西无法以编程方式检查;例如,如果您的函数终止。

务实地查看它,看看包assertthattestthatassertthat将帮助您插入“介于两者之间”的结果,testthat用于编写正确的测试。是的,编写测试的常用方法是创建一个包含测试数据的小测试示例。