Pregunta

OK, así que estoy tratando de utilizar las clases S4 construir un objeto muy complejo, con ranuras incluyendo media docena de matrices, algunas listas, y probablemente un fregadero de la cocina o las dos de allí. El objeto se inicializa con referencia a y desembalaje un objeto de configuración que ya he definido. Es bastante fácil de definir la clase con setClass (), pero estoy teniendo dificultades para averiguar una manera elegante de fijar las ranuras en el setMethod ( "inicializar").

El problema es que necesito fijar elementos particulares de esos media docena de matrices a base de partes de ese objeto de configuración. Para cada elemento del objeto de configuración, puede que tenga que configurar elementos específicos de varias de las matrices. Tenga en cuenta que las matrices que están en el alcance / ambiente de la función de inicialización. entonces tengo funciones anidadas dentro de la función de inicialización que hacen la asignación real de las matrices, o esa es la idea de todos modos. Esas funciones pueden, por supuesto ver las matrices, pero no pueden Modificar porque el <- operador crea una nueva matriz si la variable original no se definió en el entorno actual . R es pase por valor, y significa que. Esto es cierto incluso para las ranuras de la .Object que estoy tratando de inicializar. Así que no puedo usar funciones anidadas para hacer la inicialización.

Por desgracia, estas funciones anidadas tienen que modificar varias de las matrices, por lo que la devolución de valores y hacer la tarea en la función principal de inicialización no es práctico o elegante. (Sin embargo, es posible, si Metí copias de las matrices en las listas devueltas y luego las combinan en la principal función de inicialización. Aunque feo, y requeriría una gran cantidad de código extra.)

Y iteración (lo que evitaría este problema de alcance) no es muy práctico, ya sea debido a la naturaleza jerárquica del objeto de configuración, lo que realmente quiere ser atravesado con llamadas recursivas.

La última opción que se me ocurre sería utilizar la función de asignación () con la opción envir para forzar la asignación de aplicar a la variable no local. Pero el uso de entornos como el que parece repulsivo, como una instrucción goto ...

Así que, ¿cuál es el enfoque más pirata? Seguir con la programación funcional pura y estructuras de datos fea construcción sólo para pasar de manera ineficiente matrices redundantes alrededor? Tratar de encontrar una solución iterativo que evita funciones en total? Usar la magia profunda jugando con entornos?

¿Fue útil?

Solución

¿Has mirado en <<-? Se hace la asignación en el entorno de los padres un poco más fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top