Question

OK, donc je suis en train d'utiliser des classes S4 pour construire un objet très complexe, avec des fentes dont une demi-douzaine de matrices, quelques listes, et probablement un évier de cuisine ou deux là-dedans. L'objet est initialisé en se référant à déballer et un objet de configuration que je l'ai déjà défini. Il est assez facile de définir la classe avec setClass (), mais je vais avoir des difficultés pour trouver une façon élégante de fixer les fentes dans la setMethod ( « initialiser »).

Le problème est que je dois définir des éléments particuliers de ces matrices demi-douzaine basés sur des parties de cet objet de configuration. Pour chaque élément de l'objet de configuration, je peux avoir à définir des éléments spécifiques de plusieurs des matrices. Notez que les matrices sont dans le champ d'application / environnement de la fonction d'initialisation. alors j'ai imbriqué fonctions au sein de la fonction d'initialisation qui font l'affectation réelle des matrices, ou que l'idée est de toute façon. Ces fonctions peuvent bien sûr voir les matrices, mais ils ne peuvent pas modify eux parce que le <- opérateur crée une nouvelle matrice si la variable d'origine n'a pas été défini dans l'environnement actuel . R est un passage par la valeur, et des moyens lui. Cela est vrai même pour les machines à sous de la .object je suis en train d'initialiser. Donc, je ne peux pas utiliser les fonctions imbriquées pour faire l'initialisation.

Malheureusement, ces fonctions imbriquées doivent modifier plusieurs des matrices, de sorte que le retour des valeurs et de faire l'affectation dans la fonction principale initialize est pas pratique ou élégant. (Mais il est possible, si je fourrai des copies des matrices dans des listes retournées puis les combinés dans la fonction principale d'initialisation. Truand bien, et il faudrait beaucoup de code supplémentaire.)

Et itération (qui empêcherait cette question de la portée) n'est pas très pratique soit en raison de la nature hiérarchique de l'objet de configuration, qui veut vraiment être traversé avec des appels récursifs.

La dernière option que je peux penser serait d'utiliser la fonction Assign () avec l'option Envir pour forcer l'affectation à appliquer à la variable non locale. Mais en utilisant des environnements comme ça semble dégueu, comme un goto ...

Alors, quelle est l'approche la plus piratique? Stick avec la programmation fonctionnelle pure et construire des structures de données laides juste pour passer inefficacement matrices redondantes autour? Essayez de trouver une solution itérative qui évite des fonctions tout à fait? Utilisez la magie profonde en jouant avec des environnements?

Était-ce utile?

La solution

Avez-vous regardé <<-? Il rend l'affectation dans l'environnement parent un peu plus facile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top