Chcę, aby dwa różne zdarzenia wyzwalały aktualizację danych używanych przez różne wykresy / wyjścia w mojej aplikacji. Jeden to klikany przycisk ( input$spec_button
), a drugi to punkt klikniętej kropki ( mainplot.click$click
).
Zasadniczo chcę wymienić oba te elementy jednocześnie, ale nie jestem pewien, jak napisać kod. Oto, co mam teraz:
na serwerze.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
}
})
Ale klauzula if-else nie działa
Error in mainplot.click$click | input$spec_button :
operations are possible only for numeric, logical or complex types
-> Czy jest jakaś funkcja łącząca akcje, której mogę użyć dla mainplot.click$click | input$spec_button
klauzuli?
Odpowiedzi:
Wiem, że to jest stare, ale miałem to samo pytanie. W końcu to rozgryzłem. Umieszczasz wyrażenie w nawiasach klamrowych i po prostu podajesz zdarzenia / reaktywne obiekty. Moje (bezpodstawne) przypuszczenie jest takie, że błyszcząca po prostu wykonuje taką samą reaktywną analizę wskaźnika do tego bloku wyrażenia, jak do
reactive
bloku standardowego .observeEvent({ input$spec_button mainplot.click$click 1 }, { ... } )
EDYTOWAĆ
Zaktualizowano, aby obsłużyć przypadek, w którym ostatnia linia w wyrażeniu zwraca NULL. Po prostu zwróć stałą wartość.
źródło
observeEvent
używaignoreNULL = TRUE
domyślnie, co oznacza, że jeślimainplot.click$click
(wartość zwracana) jestNULL
, procedura obsługi nigdy nie zostanie wywołana, nawet jeśli zostanieinput$spec_button
zmieniona. Poleciłbym odpowiedź w stylu @ JustAnother, aby zapobiec wpadnięciu w tę pułapkę.{}
) WYMAGA, aby każde zdarzenie znajdowało się we własnym znaku nowej linii, w przeciwnym razie zakończy się niepowodzeniem z komunikatem „Błąd w analizie ...”, gdy tylko parser napotka drugie zdarzenie. np. wszystko w jednej linii:observeEvent({input$spec_button mainplot.click$click}, {...})
niepowodzenie. Odpowiedź @ JustAnother za pomocą S3 Generic Combination syntax (c()
) działa niezależnie od nowych linii.Również:
observeEvent(c( input$spec_button, mainplot.click$click ), { ... } )
źródło
{
wersja nie. Nie potrafię wyjaśnić, dlaczego tak jest.input$button1
iinput$button2
że zrobić bardzo podobne rzeczy, tylko z innym indeksem. Chciałbym uniknąć wielokrotnego kopiowania kodu tylko dlatego, że nie znam indeksu. Dzięki!Rozwiązałem ten problem, tworząc obiekt reaktywny i używając go w wyrażeniu zmiany zdarzenia. Jak poniżej:
xxchange <- reactive({ paste(input$filter , input$term) }) output$mypotput <- eventReactive( xxchange(), { ... ... ... } )
źródło
Oto rozwiązanie, które wymyśliłem: w zasadzie utwórz pusty
reactiveValues
uchwyt danych, a następnie zmodyfikuj jego wartości w oparciu o dwa oddzielneobserveEvent
instancje.źródło
list(mainplot.click$click, input$spec_button)
również działać na sposób OP.Nadal można to zrobić za pomocą eventReactive, po prostu umieszczając swoje akcje w wektorze.
eventReactive( c(input$spec_button, mainplot.click$click), { ... } )
źródło
Pomysł polega na utworzeniu funkcji reaktywnej, która wykona warunek, który chcesz przekazać w observEvent, a następnie możesz przekazać tę funkcję reaktywną, aby sprawdzić poprawność instrukcji. Na przykład:
validate_event <- reactive({ # I have used OR condition here, you can use AND also req(input$spec_button) || req(mainplot.click$click) }) observeEvent(validate_event(), { ... } )
Koduj dalej!
źródło