2011-09-03 24 views
7

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) 
} 
+0

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

+0

@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

+0

¿Podría decirnos qué tipo de objeto devuelve 'GRanges()'? es decir, la salida de 'str (p.ranges)', 'str (g.ranges)' –

Respuesta

7

Creo que esta línea es el culpable:

links <- p.ranges %in% g.ranges[names(g.ranges) == g.name].

%in% es match, y eso es lo que el mensaje de error parece estar leyendo:

ERROR in test.MyFunction: Error in match(x, table, nomatch = 0L) : 
    'match' requires vector arguments 

Hay algo acerca de p.ranges y g.ranges que no le gusta. Es decir, no se les puede obligar a usar vectores o no se está subconjuntando correctamente y el tipo de objeto es incorrecto ([ o [[).

+0

gracias, veré qué puedo hacer para cambiar esta línea específica, pero todavía no está claro para mí por qué esta línea funciona cuando se ejecuta interactivamente en la consola R, pero de lo contrario ... – tflutre

+1

He visto este error antes. Me pasa cuando ejecuto código línea por línea versus dentro de una función. Siempre tiene que ver con pasar la clase de objeto incorrecta a una función que no la entiende.El mensaje de error lo dice todo, y por lo que puedo ver, esta es la única línea que usa% en% aka match. –

Cuestiones relacionadas