我正在学习如何开发一个R包。一切顺利,感谢RUnit的R手册和this wiki。更确切地说,当我一个新的R控制台内启动我的单元测试,所有测试成功完成:为什么我的单元测试在R控制台中成功运行,但是返回“make test”错误?
#rm(list=ls())
library(RUnit)
testSuite <- defineTestSuite("current", "~/src/mypkg/inst/unitTests/")
isValidTestSuite # returns TRUE
runTestSuite(testSuite) # returns Number of errors: 0 and Number of failures: 0
然而,当我启动它们在终端,我得到了一个错误(有问题的函数使用包我安装在“〜/ src/Rlibs”中):
$ make test R_LIBS="~/src/Rlibs/"
...
ERROR in test.MyFunction: Error in match(x, table, nomatch = 0L) :
'match' requires vector arguments
我看不到是什么原因导致了这个错误。我想你需要更多关于代码和测试的信息,但这并不容易,因为我不知道如何在一个小例子上复制这个错误,而不用为此创建一个新的包。也许你们中的一些人会对这个错误信息有所了解并给我一些提示?
编辑:帮助某人给我提示错误,这是我为虚拟包编写的代码。目的是找出“g”项中包含哪些“p”项。
下面是测试:
test.MyFunction <- function(){
g <- list(c1=data.frame(name=c("g1","g2"), start=c(11,1111),
end=c(500,1500), strand=c("+","+"), stringsAsFactors=FALSE))
p <- list(c1=data.frame(name=c("p1","p2"), strand=c("+","-"),
start=c(11,601), end=c(20, 610), stringsAsFactors=FALSE))
exp <- list(c1=list(g1=c("p1"))) # item "p1" is included in item "g1"
obs <- MyFunction(g, p)
checkEquals(obs, exp)
}
这里是函数本身:
MyFunction <- function(g, p){
res <- lapply(names(g), function(c.name){
res.c <- list()
nb.g <- length(g[[c.name]]$name)
if(length(.find.package("GenomicRanges", quiet=TRUE)) > 0){
g.ranges <- GRanges(seqnames=Rle(c(c.name), c(nb.g)),
ranges=IRanges(g[[c.name]]$start,
g[[c.name]]$end, names=g[[c.name]]$name),
strand="*")
p.ranges <- GRanges(seqnames=Rle(c(c.name), nrow(p[[c.name]])),
ranges=IRanges(p[[c.name]]$start,
p[[c.name]]$end, names=p[[c.name]]$name),
strand=p[[c.name]]$strand)
for(g.name in names(g.ranges)){
links <- p.ranges %in% g.ranges[names(g.ranges) == g.name]
if(sum(links) > 0)
res.c[[g.name]] <- names(p.ranges)[which(links)]
}
} else{
msg <- "can't find package GenomicRanges"
stop(msg, call.=FALSE)
}
res.c
})
names(res) <- names(g)
return(res)
}
我不知道问题是什么,但它可能是由'.Rprofile'中的某些内容引起的。你可以尝试运行'R --vanilla',看看它的行为是否有所不同。 – Owen
@Owen我试过了,但它也不起作用。事实上,如果我像这样启动它,我甚至不能使用--vanilla,因为R需要至少读取我的〜/ .Renviron以查找GenomicRanges包(通过env变量R_LIBS)。 – tflutre
你能告诉我们什么类型的对象是由'GRanges()'返回的吗?即str(p.ranges)',str(g.ranges)' –