Frage

OK, also versuche ich S4 Klassen zu verwenden, um ein sehr komplexes Objekt zu bauen, mit Schlitzen einer halbes Dutzend Matrizen darunter, einige Listen und wahrscheinlich eine Küchenspüle oder zwei drin. Die Aufgabe wird durch Bezugnahme auf und Auspacken ein Konfigurationsobjekt initialisiert, die ich habe bereits definiert. Es ist einfach genug, um die Klasse mit setClass () zu definieren, aber ich habe Schwierigkeiten, eine elegante Art und Weise der Einstellung die Schlitze in der setMethod ( „initialisieren“) herauszufinden.

Das Problem ist, dass ich auf Teilen dieses Konfigurationsobjekt bestimmte Elemente dieser halben Dutzend Matrizen auf Basis einstellen müssen. Für jedes Element des Konfigurationsobjekt kann ich bestimmte Elemente mehrerer der Matrizen setzen müssen. Beachten Sie, dass die Matrizen sind in den Geltungsbereich / Umgebung der Initialisierungsfunktion. Ich habe dann verschachtelte Funktionen innerhalb der Initialisierungsfunktion, die die tatsächlichen Zuordnung zu den Matrizen zu tun, oder das ist die Idee trotzdem. Diese Funktionen können natürlich sehen die Matrizen, aber sie können nicht modify sie, weil der <- Operator eine neue Matrix erstellt, wenn die ursprüngliche Variable nicht in der aktuellen Umgebung definiert wurde . R ist Pass-by-Wert, und Mittel, um es. Dies gilt auch für die Schlitze des .Object ich zu initialisieren bin versucht. So kann ich nicht verschachtelte Funktionen verwenden, um die Initialisierung zu tun.

Leider ist diese verschachtelten Funktionen mehrere der Matrizen ändern, also Werte zurückgegeben werden und dabei die Zuordnung in der Haupt Initialisierungsfunktion ist nicht praktikabel oder elegant. (Aber es ist möglich, wenn ich gestopft Kopien der Matrizen in zurück Listen und sie dann in der Haupt initialize-Funktion kombiniert. Hässlich aber, und würde eine Menge zusätzlichen Code erforderlich.)

Und Iteration (die dieses Scoping Problem verhindern würde) ist nicht sehr praktisch, entweder wegen der hierarchischen Natur des Konfigurationsobjekts, das wirklich will, mit rekursiven Aufrufen durchlaufen werden.

Die letzte Option, die ich denken kann, wäre die assign () Funktion mit der envir Option zu verwenden, um die Zuordnung zu zwingen, auf den nicht-lokalen Variable anzuwenden. Aber der Einsatz von Umgebungen wie das scheint eklig, wie eine goto-Anweisung ...

Also, was ist der piratical Ansatz? Stick mit rein funktionaler Programmierung und bauen hässliche Datenstrukturen nur ineffizient läuft um redundante Matrizen? Versuchen Sie, eine iterative Lösung zu finden, die Funktionen gänzlich vermeidet? Verwenden tiefe Magie durch das Spiel mit Umgebungen?

War es hilfreich?

Lösung

Haben Sie sich <<-? Es macht in der Elternumgebung ein wenig leichter zugeordnet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top