Ich versuche eine GUI (mit gWidgets) für ein R-Paket zu entwickeln. Mein Plan war, ein Hauptfenster zu konstruieren, das die Daten enthält, und mit Schaltflächen, die kleine GUI-Wrapper für jede Funktion aufrufen. Leider stehe ich auf einem grundlegenden (?) Problem fest - ich weiß nicht, wie man die Daten überträgt.
Questons:
Mein Problem ist ähnlich zu: Laden und Speichern von Variablen in R mit gWidgets , aber von was Ich habe gelesen, die Verwendung von .GlobalEnv wird nicht empfohlen.
Ich habe auch jemanden gesehen, der den & lt; & lt; - Operator verwendet: Ссылка , aber ich kann es nicht richtig reproduzieren (und es wird nicht mit meinem Beispiel funktionieren, denke ich).
Unten ist ein einfaches Beispiel, wo ich versuche, einen Text zu einem anderen Fenster zu senden und wieder zurück, wenn die Taste gedrückt wird. Ich habe versucht mit der Rückkehr in den Handler, aber das funktioniert nicht (auch nicht sicher, ob es erlaubt ist). Das Unterfenster gibt sofort seinen Wert am Ende der Funktion zurück, bevor die Handler / Inner-Funktion auf die Daten einwirken kann. Ich weiß nicht, wie ich vom Hundeführer zum Hauptfenster komme.
%Vor%Aktualisierung: Hier ist die Lösung, die ich als den Weg vorwärts wählte (wie von jverzani vorgeschlagen), illustriert mit dem obigen Beispiel. Ich hoffe, dass ich die vorgeschlagene Lösung richtig verstanden habe und dass ich sie auf eine "nette" Weise umgesetzt habe, die idealerweise bei CRAN akzeptiert wird.
Zusammenfassend habe ich eine neue Umgebung innerhalb der Hauptfensterumgebung erstellt. Ich habe das Unterfenster bearbeitet, um die Umgebung in den Anruf zu bringen. Durch Drücken der Schaltfläche im Unterfenster assign
des bearbeiteten Textes in die übergebene Umgebung. Wenn das Unterfenster geschlossen wird und das Hauptfenster in den Fokus kommt, kann der bearbeitete Text mit get
von der Umgebung aus aufgerufen werden.
Ein besserer Ansatz, der jedoch eine größere Überarbeitung Ihres Codes erfordert, ist das Speichern von GUIs in Referenzklassen.
Sie rufen setRefClass
mit einer Liste von Feldern (eines für jedes Widget) auf und definieren eine Initialisierungsmethode, in der die GUI erstellt wird. Ich erstelle normalerweise eine Funktion, um den Aufruf zu umbrechen, der eine Instanz erstellt. Siehe setRefClass
am Ende des Codeblocks.
Sie können die Widgets für jedes Fenster in einer Liste einfach zurückgeben. Also fügt die Hauptfunktion die Zeile list(w = w, txt = txt, btn = btn)
am Ende hinzu, um jedes Widget zurückzugeben und sie zugänglich zu machen, nachdem die Funktion beendet ist.
Das folgende Beispiel ist die kleinste Änderung an Ihrem Code, die funktioniert, aber es gibt einen kleinen Fehler darin, dass main
und subwindow
jetzt Verweise auf die Rückgabewerte enthalten. Der Code funktioniert, aber wenn Sie etwas komplizierteres tun, könnte es leicht schwierig zu pflegen.