Estoy aprendiendo a desarrollar un paquete R. Todo va bien, gracias a los manuales R y al wiki this de RUnit. Más precisamente, cuando inicio mis pruebas de unidad dentro de una nueva consola R, todas las pruebas terminen con éxito:¿Por qué mi prueba unitaria se ejecuta correctamente en la consola R pero devuelve un error con "hacer prueba"?
#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
Sin embargo, cuando les lanzamiento en un terminal, tengo un error (la función en cuestión utiliza el paquete GenomicRanges que he instalado en "~/src/Rlibs"):
$ make test R_LIBS="~/src/Rlibs/"
...
ERROR in test.MyFunction: Error in match(x, table, nomatch = 0L) :
'match' requires vector arguments
no veo lo que está causando este error. Supongo que necesitarás más información sobre el código y la prueba, pero no es fácil porque no sé cómo reproducir este error en un pequeño ejemplo sin crear un paquete nuevo solo para esto. ¿Tal vez algunos de ustedes tendrán una idea sobre este mensaje de error y me darán algunas pistas?
Editar: para ayudar a alguien a darme una pista sobre el error, aquí está el código que escribí para un paquete ficticio. El objetivo es encontrar qué elementos de "p" se incluyen dentro de los elementos de "g".
Aquí está la prueba:
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)
}
Y aquí es la propia función:
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)
}
No sé cuál es el problema, pero puede ser causado por algo en su '.Rprofile'. Podría intentar ejecutar 'R --vanilla' y ver si se comporta de manera diferente. – Owen
@Owen Lo intenté pero tampoco funciona. De hecho, si lo lanzo así, ni siquiera puedo usar --vanilla porque R necesita leer al menos mi ~/.Renviron para encontrar el paquete GenomicRanges (a través de la variable env R_LIBS). – tflutre
¿Podría decirnos qué tipo de objeto devuelve 'GRanges()'? es decir, la salida de 'str (p.ranges)', 'str (g.ranges)' –