Ich möchte, dass zwei verschiedene Ereignisse eine Aktualisierung der Daten auslösen, die von verschiedenen Plots / Ausgaben in meiner App verwendet werden. Eine ist eine Schaltfläche, auf die geklickt wird ( input$spec_button
), und die andere ist ein Punkt auf einem Punkt, auf den geklickt wird ( mainplot.click$click
).
Grundsätzlich möchte ich für beide gleichzeitig aufgelistet sein, bin mir aber nicht sicher, wie ich den Code schreiben soll. Folgendes habe ich jetzt:
in server.R:
data <- eventReactive({mainplot.click$click | input$spec_button}, {
if(input$spec_button){
# get data relevant to the button
} else {
# get data relevant to the point clicked
}
})
Die if-else-Klausel funktioniert jedoch nicht
Error in mainplot.click$click | input$spec_button :
operations are possible only for numeric, logical or complex types
-> Gibt es eine Art Action-Combiner-Funktion, die ich für die mainplot.click$click | input$spec_button
Klausel verwenden kann?
Antworten:
Ich weiß, dass das alt ist, aber ich hatte die gleiche Frage. Ich habe es endlich herausgefunden. Sie fügen einen Ausdruck in geschweifte Klammern ein und listen einfach die Ereignisse / reaktiven Objekte auf. Meine (unbegründete) Vermutung ist, dass Shiny einfach die gleiche reaktive Zeigeranalyse für diesen Ausdrucksblock durchführt wie für einen Standardblock
reactive
.BEARBEITEN
Aktualisiert, um den Fall zu behandeln, in dem die letzte Zeile im Ausdruck NULL zurückgibt. Geben Sie einfach einen konstanten Wert zurück.
quelle
observeEvent
AnwendungenignoreNULL = TRUE
standardmäßig die Mittel , wennmainplot.click$click
(der Rückgabewert) istNULL
, wird der Handler nie auch aufgerufen werden , wenninput$spec_button
geändert. Ich würde so etwas wie die Antwort von @ JustAnother empfehlen, um zu verhindern, dass Sie in diese Falle tappen.{}
) jedes Ereignis in einer eigenen neuen Zeile benötigt, andernfalls schlägt sie mit "Fehler beim Parsen ..." fehl, sobald der Parser auf das zweite Ereignis stößt. zB alles in einer Zeile:observeEvent({input$spec_button mainplot.click$click}, {...})
schlägt fehl. Die Antwort von @ JustAnother mit S3 Generic Combine Syntax (c()
) funktioniert unabhängig von Zeilenumbrüchen.Ebenfalls:
quelle
{
Version nicht. Ich kann nicht erklären, warum das so ist.Ich habe dieses Problem gelöst, indem ich ein reaktives Objekt erstellt und es im Ereignisänderungsausdruck verwendet habe. Wie nachstehend:
quelle
Hier ist die Lösung, die ich gefunden habe: Erstellen Sie im Grunde genommen einen leeren
reactiveValues
Datenhalter und ändern Sie seine Werte basierend auf zwei separatenobserveEvent
Instanzen.quelle
list(mainplot.click$click, input$spec_button)
auch für OP funktionieren.Dies kann mit eventReactive weiterhin durchgeführt werden, indem Sie Ihre Aktionen einfach in einen Vektor einfügen.
quelle
Hier geht es darum, eine reaktive Funktion zu erstellen, die die Bedingung ausführt, die Sie in watchEvent übergeben möchten. Anschließend können Sie diese reaktive Funktion übergeben, um die Gültigkeit der Anweisung zu überprüfen. Zum Beispiel:
Codieren Sie weiter!
quelle