2012-09-07 852 views
8

Estoy intentando crear un paquete en R en el que he creado muchas clases personalizadas nuevas. Cada clase está en un archivo diferente. Las clases heredan de una clase principal y heredan a otras clases.Vinculación de varios archivos al crear un paquete en R

Mientras se ejecuta mis códigos Me llaman cada uno de ellos de esta manera

source("package/father.R") 
source("package/son.R") 
source("package/grandson.R")  

Definición de algunos de los métodos que necesita la clase definida en el nieto de la clase Hijo. Yo uso package.skeleton() para llamar a cada uno de ellos y crear un paquete y parece funcionar bien. Pero cuando se ejecuta R CMD Check (y cuando se intenta instalar en R), arroja un error porque la función intenta llamar a los archivos en orden alfabético, por lo que se llama al archivo grandson.R antes de son.R y se muestra y se dice error. que los métodos no han sido definidos. Si cambio los nombres a zgrandson.R, R llamó ese archivo el último, y todo parece funcionar bien, pero evidentemente no es una solución para el problema.

He leído tutoriales para crear paquetes, pero todos parecen tratar casos simples en los que no hay herencia/llamar a otros archivos en R. Espero haber dejado en claro.

+0

buen trabajo en una primera publicación. –

+2

"Si cambio los nombres a zgrandson.R, R llamó ese archivo el último, y todo parece funcionar bien, pero evidentemente no es una solución para el problema". ¿Por qué? Esta es exactamente la solución que uso y muchas otras también (inicie los primeros scripts con algo como '00Classes.R'). –

+0

Eso está funcionando bien, pero parecía una manera tan fea/hackosa de resolver el problema: D. Gracias por informarme que otras personas también están usando esta solución. Aunque me pregunto si el problema es con mi propia estructura de código, ya que ninguno de los scripts de buenos programadores que he visto parece llamar a otros archivos. –

Respuesta

5

Por lo que tengo entendido, puede usar el campo Collate en el archivo DESCRIPTION para controlar esto.

Citando del Writing R Extensions manual:

campo Un ‘Intercalar’ se puede utilizar para controlar el orden de clasificación de los archivos de código R en un paquete cuando éstos se procesan para su paquete de instalación . El valor predeterminado es cotejar según la configuración regional 'C'. Si está presente, la especificación del cotejo debe enumerar todos los archivos de código R en el paquete (teniendo posibles subdirectorios específicos del sistema operativo en cuenta, ver los subdirectorios de paquetes) como una lista separada por espacios en blanco de las rutas del archivo relativas al subdirectorio R. Se deben citar las rutas que contienen espacios en blanco o . Se utilizará un campo de intercalación específico del sistema operativo ('Collate.unix' o 'Collate.windows') en lugar de 'Intercalar'.

Por lo tanto, se podría especificar:

Collate: 
    father.r 
    son.R 
    grandson.r 

O simplemente cambiar el nombre de los archivos de tal manera que el orden lexicográfico de clasificación dará lugar a la orden de clasificación correcta, como usted ha indicado en su pregunta.


Pero también ver this answer por @DirkEddelbuettel sobre una cuestión similar.

+0

¡Respuesta perfecta! Muchas gracias por la respuesta súper rápida :) –

Cuestiones relacionadas