2012-03-22 17 views
11

Tengo un paquete que escribí mientras aprendía R y su lista de dependencias es bastante larga. Estoy tratando de recortar hacia abajo, para dos casos:Buscar todas las funciones existentes para las dependencias del paquete?

  1. que me pasa a otros enfoques, y los paquetes listados en Suggests simplemente no se utilizan en absoluto.
  2. Sólo una función de toda mi paquete se basa en una dependencia determinada, y me gustaría cambiar a un enfoque donde es loaded only when needed.

¿Hay una forma automatizada para rastrear a estos dos casos? Puedo pensar en dos enfoques crudos (descargar la lista de funciones en todos los paquetes dependientes y automatizar una búsqueda de texto a través del código de mi paquete, o cargar las funciones del paquete sin cargar los paquetes necesarios y ejecutar hasta que haya un error), pero tampoco parece particularmente elegante o infalible ...

+1

¡Me encantaría saber esto también! Siempre puede eliminar toda la lista de dependencias y ejecutar 'R CMD check' para ver de qué" dependencias no declaradas "se queja, pero tampoco es lo ideal. –

+0

Sospecho que terminaré haciendo algo así, pero manteniendo la esperanza de una solución más elegante :-) –

+2

Una forma rápida de verificar la dependencia de la función es compilarla en byte porque si no le das a los espacios de nombres los comandos que provienen de paquetes, se quejarán de que no está disponible en un ámbito global. – Hansi

Respuesta

1

Una forma de comprobar las dependencias en todas las funciones es utilizar el compilador de bytes porque eso verificará las funciones disponibles en el espacio de trabajo global y emitirá un aviso si no encuentra dicha función .

Así que si usted como ejemplo utiliza la función na.locf del paquete zoológico en cualquiera de sus funciones y, a continuación Byte compilar su función obtendrá un mensaje como este:

Note: no visible global function definition for 'na.locf' 

Para abordar correctamente para la compilación de bytes debe escribirlo como zoo :: na.locf

Así que una forma rápida de probar todas las funciones R en una biblioteca/paquete podría hacer algo como esto (suponiendo que no haya escrito las llamadas a otras funciones con el espacio de nombres):

Suponiendo que los archivos de R con las funciones se encuentran en C: \ SomeLibrary \ o subcarpetas de allí y luego se definen un archivo sourceing como C: \ SomeLibrary.r o similar que contiene:

if (!(as.numeric(R.Version()$major) >=2 && as.numeric(R.Version()$minor) >= 14.0)) { 
     stop("SomeLibrary needs version 2.14.0 or greater.") 
} 

if ("SomeLibrary" %in% search()) { 
     detach("SomeLibrary") 
} 

currentlyInWorkspace <- ls() 

SomeLibrary <- new.env(parent=globalenv()) 

require("compiler",quietly=TRUE) 

pathToLoad <- "C:/SomeLibraryFiles" 

filesToSource <- file.path(pathToLoad,dir(pathToLoad,recursive=TRUE)[grepl(".*[\\.R|\\.r].*",dir(pathToLoad,recursive=TRUE))]) 

for (filename in filesToSource) { 

     tryCatch({ 
       suppressWarnings(sys.source(filename, envir=SomeLibrary)) 
     },error=function(ex) { 
       cat("Failed to source: ",filename,"\n") 
       print(ex) 
     }) 
} 

for(SomeLibraryFunction in ls(SomeLibrary)) { 
     if (class(get(SomeLibraryFunction,envir=SomeLibrary))=="function") { 
       outText <- capture.output(with(SomeLibrary,assign(SomeLibraryFunction,cmpfun(get(SomeLibraryFunction))))) 
       if(length(outText)>0){ 
         cat("The function ",SomeLibraryFunction," produced the following compile note(s):\n") 
         cat(outText,sep="\n") 
         cat("\n") 
       } 
     } 
} 

attach(SomeLibrary) 

rm(list=ls()[!ls() %in% currentlyInWorkspace]) 

invisible(gc(verbose=FALSE,reset=TRUE)) 

A continuación, iniciar la I sin precargado paquetes y fuente en C: \ SomeLibrary.r

Y luego debe obtener notas de cmpfun para cualquier llamada a una función en un paquete que no es parte de los paquetes base y no tiene un espacio de nombres completamente calificado.

Cuestiones relacionadas