Я учусь разрабатывать пакет R. Все идет хорошо, благодаря руководствам R и этой вики для RUnit. Точнее, когда я запускаю свои модульные тесты в новой консоли R, все тесты успешно завершаются:
#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
Однако, когда я запускаю их в терминале, я получил одну ошибку (рассматриваемая функция использует пакет GenomicRanges , который я установил в "~ / src / Rlibs"):
$ make test R_LIBS="~/src/Rlibs/"
...
ERROR in test.MyFunction: Error in match(x, table, nomatch = 0L) :
'match' requires vector arguments
Я не вижу, что вызывает эту ошибку. Я думаю, вам понадобится больше информации о коде и тесте, но это нелегко, потому что я не знаю, как воспроизвести эту ошибку на небольшом примере, не создавая новый пакет только для этого. Может быть, у кого-то из вас возникнет идея об этом сообщении об ошибке и вы дадите мне несколько советов?
Редактировать: , чтобы помочь кому-нибудь дать мне подсказку об ошибке, вот код, который я написал для фиктивного пакета. Цель состоит в том, чтобы найти, какие элементы "p" включены в элементы "g".
Вот тест:
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)
}