2009-12-10 52 views
4

所以我决定将我的几个R函数放到一个包中,我正在阅读/学习Writing R Extension发送包含单元测试的R包

它显然抱怨我做得不对的事情。我在这里发了几个问题,这个是关于测试风格:我使用RUnit,我喜欢测试尽可能接近正在测试的代码。这样我就不会忘记测试,并将测试作为技术文档的一部分。

例如:

fillInTheBlanks <- function(S) { 
    ## NA in S are replaced with observed values 

    ## accepts a vector possibly holding NA values and returns a vector 
    ## where all observed values are carried forward and the first is 
    ## carried backward. cfr na.locf from zoo library. 
    L <- !is.na(S) 
    c(S[L][1], S[L])[1 + cumsum(L)] 
} 

test.fillInTheBlanks <- function() { 
    checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4)) 
    checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4)) 
    checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4)) 
} 

R CMD check问题音符线,像这样的:

test.fillInTheBlanks: no visible global function definition for 
    ‘checkEquals’ 

,并抱怨我没有记录的测试功能。

我真的不想为测试函数添加文档,我绝对不想为RUnit软件包添加依赖项。

你觉得我应该看看这个问题?

回答

4

你在哪里进行单元测试?您可能不想将它们放入R目录。更标准的方法是把它们放在inst\unitTests之下。看看this R-wiki page regarding the configuration.

或者,您可以指定哪些文件将在NAMESPACE中导出,并且通过扩展来指定哪些函数应该也应该不被记录。

除此之外,理想情况下,您应该在R CMD CHECK被调用时运行测试;这是设计的一部分。在这种情况下,您应该创建一个测试脚本,以在单独的tests目录中调用您的测试。你需要在这个脚本中加载RUnit包(但你不需要使它成为你的包的依赖)。

编辑1:

关于你的失败,因为它无法找到checkEquals功能:我会改变你的功能是这样的:

test.fillInTheBlanks <- function() { 
    require(RUnit) 
    checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4)) 
    checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4)) 
    checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4)) 
} 

这样的包加载时该函数被调用,或者它会通知用户该包是必需的。

编辑2:

"Writing R Extensions"

注意,在一个包中的所有用户级对象应记录;如果软件包pkg包含仅供“内部”使用的用户级对象,则它应提供文件pkg-internal。Rd记录了所有这些对象,并明确指出这些并不意味着被用户调用。见例如例如R分布中的封装网格的来源。请注意,广泛使用内部对象的软件包应将这些对象隐藏在名称空间中,而不需要记录它们(请参阅软件包名称空间)。

您可以使用pkg-internal.Rd文件作为一个选项,但如果您打算使用多个隐藏对象,通常会在NAMESPACE中的声明中处理。

+0

我把它们放在要测试的函数的定义下。将编辑问题以使自己清楚。 – mariotomo 2009-12-10 12:51:42

+0

我明白了。然后使用NAMESPACE文件,如果您不想记录它们,则不要导出这些测试。除此之外,您可能需要在这些函数的顶部添加* require(RUnit)*,以便您不必显式加载它。 – Shane 2009-12-10 12:55:44

+0

我把它们放在要测试函数的定义下(见编辑问题)。我会跟随你的链接,看看我能做些什么,谢谢。 – mariotomo 2009-12-10 12:56:18

1

您是否加载了包装RUnit

最好的办法可能是使用RUnit查看包含现有代码的软件包。

相关问题