Shiny eventReactive 핸들러 내에서 둘 이상의 이벤트 표현식을 수신하는 방법


85

내 앱의 다양한 플롯 / 출력에서 ​​사용되는 데이터의 업데이트를 트리거하는 두 가지 다른 이벤트를 원합니다. 하나는 클릭되는 버튼 ( input$spec_button)이고 다른 하나는 클릭 되는 점의 포인트 ( mainplot.click$click)입니다.

기본적으로 동시에 두 가지를 모두 나열하고 싶지만 코드 작성 방법을 잘 모르겠습니다. 지금 내가 가진 것은 다음과 같습니다.

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
    }
  })

그러나 if-else 절은 작동하지 않습니다.

Error in mainplot.click$click | input$spec_button : operations are possible only for numeric, logical or complex types

-> mainplot.click$click | input$spec_button절에 사용할 수있는 일종의 동작 결합 기능이 있습니까?


! is.null (input $ spec_button)의 출력을 확인할 수 있습니까?
Gopala

답변:


94

나는 이것이 오래되었다는 것을 알고 있지만 같은 질문이 있었다. 나는 마침내 그것을 알아 냈습니다. 중괄호 안에 표현식을 포함하고 단순히 이벤트 / 반응 객체를 나열합니다. 내 (확실하지 않은) 추측은 shiny가이 표현식 블록에 대해 표준 reactive블록 과 동일한 반응 포인터 분석을 수행한다는 것 입니다.

observeEvent({ 
  input$spec_button
  mainplot.click$click
  1
}, { ... } )

편집하다

식의 마지막 줄이 NULL을 반환하는 경우를 처리하도록 업데이트되었습니다. 상수 값을 반환하기 만하면됩니다.


1
내 원래 솔루션보다 더 나은 솔루션 인 것 같기 때문에 수락 된 답변을 변경합니다.
Hillary Sanders

3
어떤 이벤트가 트리거되었는지 확인할 수 있습니까?
PeterVermont

내가 아는 것은 아닙니다. 몇 가지 경우에 개별 변수를 추적하고 어떤 것이 변경되었는지 직접 비교하여이를 수행했습니다. 그러나 그것은 추악합니다. 메인 코드를 함수에 넣은 다음 fn을 호출하는 두 개의 observeEvents를 갖고 각 이벤트에 대해 특정 작업을 수행하는 것이 좋습니다.
Duncan Brown

8
경고 : 기본적으로 observeEvent사용합니다 . ignoreNULL = TRUE즉, mainplot.click$click(반환 값)이 이면 변경 되더라도 NULL처리기가 호출 되지 않습니다input$spec_button . 이 함정에 빠지지 않도록 @JustAnother의 답변과 같은 것을 추천합니다.
greg L

1
또 다른 경고 : 내 테스트에서이 대괄호 구문 ( {})은 각 이벤트가 자체 줄 바꿈에 있어야 한다는 것을 발견했습니다 . 그렇지 않으면 파서가 두 번째 이벤트를 만나 자마자 "Error in parse ..."로 실패합니다. 예를 들어, 모두 한 줄에 : observeEvent({input$spec_button mainplot.click$click}, {...})실패합니다. S3 Generic Combine syntax ( c())를 사용하는 @JustAnother의 대답 은 줄 바꿈에 관계없이 작동합니다.
Brian D

54

또한:

observeEvent(c( 
  input$spec_button,
  mainplot.click$click
), { ... } )

6
이것은 @DuncanBrown의 대답과 매우 비슷해 보이지만 두 개의 작업 버튼이 모두 모달을 트리거하는 상황을 발견 {했지만 작동했지만 버전은 그렇지 않았습니다. 그 이유를 설명 할 수 없습니다.
John Paul

2
이 답변이 어떻게 다른지 (그리고 더 나은 IMO)에 대한 @Duncan Brown의 답변에 댓글 추가
greg L

이것은 나를 위해 작동하지 않습니다-나는 오류가 발생합니다 (빛나는 1.0.5)
potockan

어떤 이벤트가 트리거되었는지 확인할 수있는 방법이 있습니까? 나는 두 개의 버튼을 가지고 말할 수 input$button1그리고 input$button2그건 그냥 다른 지수와 매우 비슷한 일을한다. 색인을 모르기 때문에 코드를 여러 번 복사하는 것을 피하고 싶습니다. 감사!
Nikos Bosse

10

반응 객체를 생성하여이 문제를 해결하고 이벤트 변경 표현에 사용했습니다. 아래:

xxchange <- reactive({
paste(input$filter , input$term)
})

output$mypotput <- eventReactive( xxchange(), {
...
...
...
} )

4
이것은 더 많은 설명에서 도움이 될 수있는 아주 좋은 대답입니다. 받아 들여지는 대답은 더 간단하여 기초적인 프로그램에 더 적합하지만이 대답은 크고 복잡한 코드에 더 적합합니다. 답에서 두 점이 누락 된 것 같습니다. (1) 붙여 넣기 (또는 목록)는 두 이벤트를 같은 줄에 배치하여 코드를 더 간결하게 만듭니다. (2) 반응 객체는 둘 이상의 리스너가 동일한 이벤트 세트를 수신하는 경우 동일한 두 이벤트를 반복해서 반복하는 노력을 절약합니다.
Agriculturist

5

내가 생각 해낸 해결책은 다음과 같습니다. 기본적으로 빈 reactiveValues데이터 홀더를 만든 다음 두 개의 개별 observeEvent인스턴스를 기반으로 값을 수정 합니다.

  data <- reactiveValues()
  observeEvent(input$spec_button, {
    data$data <- get.focus.spec(input=input, premise=premise, 
                                itemname=input$dropdown.itemname, spec.info=spec.info)
  })
  observeEvent(mainplot.click$click, {
    data$data <- get.focus.spec(input=input, premise=premise, mainplot=mainplot(),
                                mainplot.click_focus=mainplot.click_focus(),
                                spec.info=spec.info)  
  })

3
list(mainplot.click$click, input$spec_button)또한 영업 이익의 방법을 작동합니다.

1

이 작업은 단순히 벡터에 작업을 넣어 eventReactive로 수행 할 수 있습니다.

eventReactive(
  c(input$spec_button, mainplot.click$click), 
{ ... } )

0

여기서 아이디어는 observeEvent에서 전달하려는 조건을 실행할 반응 함수를 생성 한 다음이 반응 함수를 전달하여 명령문의 유효성을 확인할 수 있습니다. 예를 들면 :

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(), 
    { ... } 
)

계속 코딩하세요!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.