R shiny: mehrfache Verwendung in ui derselben renderUI im Server?

8

Ich müsste in mehreren Tabs meiner Benutzeroberfläche eine Eingabe verwenden, die der Benutzer auf der ersten Registerkarte bereitgestellt hat.

Es scheint, dass dies nicht möglich ist, indem renderUI auf dem Server verwendet wird und seine Ausgaben mit uiOutput in meinen verschiedenen Tabs aufgerufen werden. Hier ist ein reproduzierbarer Code

%Vor%

Gibt es einen anderen Weg, dies zu erreichen?

Vielen Dank im Voraus für jeden Vorschlag.

    
user1431694 18.02.2014, 19:50
quelle

3 Antworten

9

Sie können (sollten Sie nicht) zwei Elemente mit der gleichen ID in einem HTML-Dokument haben (ob mit Shiny oder nicht). Sicherlich bei der Verwendung von Shiny mit mehreren Elementen mit der gleichen ID wird problematisch sein. Ich würde auch subjektiv dafür stimmen, dass Sie Ihren Code wesentlich verbessern könnten, indem Sie aussagekräftige Variablennamen verwenden.

Es ist auch nicht klar, was Sie mit dieser Eingabe machen wollen. Soll das Eingabefeld auf mehreren Registerkarten angezeigt werden? Oder der Wert des textInput, der auf mehreren Tabs angezeigt wird?

Wenn es Ersteres gibt, gibt es keinen offensichtlichen Weg, dies zu tun, ohne die Klausel "mehrere Elemente mit derselben ID" zu verletzen. Letzteres wäre viel einfacher (benutze einfach renderText und sende es an verbatimOutput ), aber ich glaube nicht, dass du das fragst.

Was Sie wirklich wollen, sind mehrere Texteingaben (mit eindeutigen IDs), die synchronisiert sind. Das können Sie in separaten Beobachtern auf Ihrem Server mit etwas wie diesem tun:

%Vor%

Es gibt wahrscheinlich eine sauberere Möglichkeit, den Anfangszustand festzulegen als das cur_val , das ich tracke. Aber ich konnte mir nichts von meinem Kopf denken, also ist es da.

    
Jeff Allen 19.02.2014, 18:10
quelle
4

Das Beispiel von Jeff Allen funktioniert nur, wenn Sie die Funktionen ui und server in derselben Datei behalten. Sobald Sie sie in eine ui.R- und server.R-Datei aufteilen, erhalten Sie eine Fehlermeldung darüber, dass der Eingabewert nicht existiert:

Warnung: Unbehandelter Fehler in observer: Argument hat die Länge Null

In Shiny gibt es einen Event-Handler , der all das löst. Es ermöglicht auch die Handhabung vieler Eingabe-Widgets, da es einfacher wird, den Code zu erweitern, um ein Widget mit mehreren Eingaben zu beobachten. Dank Jeffs Beispiel habe ich folgende Lösung gefunden:

ui.R

%Vor%

server.R

%Vor%

Beachten Sie, dass ignoreNULL=TRUE standardmäßig ist, damit dies beim Start nicht fehlschlägt.

    
FvD 23.03.2015 19:32
quelle
1

Wenn Sie nach der Antwort von FvD die Elemente uiOutput und renderUI verwenden, um UI-Elemente zu erstellen, scheint es, dass shiny diese Elemente erst erzeugt, wenn das entsprechende TabPanel ausgewählt ist, wodurch seine Lösung fehlschlagen kann am Anfang. (Sobald ein Benutzer alle TabPanels mit den UI-Elementen durchlaufen hat, die Sie synchronisieren möchten, funktioniert alles, weil alle UI-Elemente erstellt wurden.)

Um dies zu umgehen, habe ich eine reaktive Variable erstellt, um den vom Benutzer ausgewählten oder erstellten Eingabewert zu speichern. Wenn dann zum ersten Mal ein anderes tabPanel mit einem synchronisierten UI-Element ausgewählt wird, wird das UI-Element mit dem Wert dieser reaktiven Variablen gerendert.

Als Beispiel habe ich selectInput -Elemente in mehreren Panels, die ich synchronisieren möchte, und das choices dieser Elemente wird erstellt, wenn die App geladen wird (basierend auf dem, was in der Dateistruktur vorhanden ist):

%Vor%     
Andrew Brick 02.07.2016 00:06
quelle

Tags und Links