Post
새소식
- Chirpy Theme 7.2.0 업데이트

R Shiny Widget 변경시 다른 Widget도 변경해 보자

shiny ui widget 변경 시 함께 연동되는 다른 widget도 함께 변경하는 방법을 알아본다.

R Shiny Widget 변경시 다른 Widget도 변경해 보자

R Shiny Widget 변경시 연동된 Widget 함게 변경하기

Shiny Widget을 이용하여 UI를 구성할 때 계층적으로 배치하는 경우가 있다. 예를 들어 카테고리에 따른 상품명을 달리 표시한다거나 선택한 항목에 따라 범위 설정을 달리해야 하는 경우가 해당된다.

아래 표를 하면에 구성할 경우를 생각해 보자.

GroupItem
Group1A
Group1B
Group1C
Group1D
Group2X
Group2Y
Group2Z

이제 selectInput1 widget에서 Group2을 선택하면 selectInput2에서는 “X, Y, Z”만 출력되도록 한다.

구현

Layout 구성

아래와 같이 간단하게 secectInput widget을 위아래로 배치한다.

1
2
3
4
selectInput("selectInput1", "Select Group", 
            multiple = F, choices = c("Group1", "Group2")),
selectInput("selectInput2", "Select Item",
            multiple = F, choices = c("A", "B", "C", "D", "X", "Y", "Z")))

reactive 등록

selectInput1 변경시 selectInput2 값을 설정하기 위해 reactive value를 등록한다. get_items()selectInput1 값을 읽어 적절한 selectInput2 값을 설정한다.

1
2
3
4
5
6
7
8
9
10
11
  get_items <- reactive({
    req(input$selectInput1)
    if(input$selectInput1 == "Group1") {
      c("A", "B", "C", "D")
    } else if(input$selectInput1 == "Group2") {
      c("X", "Y", "Z")
    } else {
      c("A", "B", "C", "D", "X", "Y", "Z")
    }
  })

변경사항 반영

observeEvent() 함수를 통해 변경사항이 발생하면 updateSelectInput() 함수로 변경된 내용을 반영한다. selectInput1을 지켜보고 있다가 변경이 발생하면 selectInput2 값을 갱신한다. 이때 위에서 작성한 get_items()를 통해 적절한 값을 출력한다.

1
2
3
4
5
  observeEvent(input$selectInput1, {
    updateSelectInput(session, inputId = "selectInput2", 
                      choices = get_items()
    )
  })

결과 확인

참고자료

  1. Observe Function in R Shiny - How to Implement a Reactive Observer
  2. R Shiny - What is the problem with my observe function ({UpdateSelectInput})?
This post is licensed under CC BY 4.0 by the author.