반응형 변수

사례 연구: R의 Shiny로 웹 애플리케이션 만들기

Dean Attali

Shiny Consultant

코드 중복

data <- gapminder
data <- subset(
    data,
    lifeExp >= input$life[1] & lifeExp <= input$life[2]
)
if (input$continent != "All") {
    data <- subset(
        data,
        continent == input$continent
   )
}
  • 3번 중복됨
    1. renderTable()
    2. renderPlot()
    3. downloadHandler()
사례 연구: R의 Shiny로 웹 애플리케이션 만들기

반응형 변수로 중복 줄이기

  • 코드 중복 ⇒ 여러 곳을 함께 관리해야 함
    • 코드 업데이트 시
    • 버그 수정 시
  • 한 군데를 빼먹기 쉬워 버그로 이어짐
  • 중복 대신 reactive() 변수를 사용하십시오
사례 연구: R의 Shiny로 웹 애플리케이션 만들기

반응형 변수

output$my_table <- renderTable({
    data <- gapminder
    data <- subset(
        data,
        lifeExp >= input$life[1] & lifeExp <= input$life[2]
    )
})
my_data <- reactive({

data <- gapminder data <- subset( data, lifeExp >= input$life[1] & lifeExp <= input$life[2] )
})
output$my_table <- renderTable({ my_data() })
사례 연구: R의 Shiny로 웹 애플리케이션 만들기

반응형 변수의 캐싱

  • 반응형 변수는 값을 캐시합니다
  • 자신의 값을 기억합니다
  • 의존성이 바뀌지 않으면 다시 실행하지 않습니다
사례 연구: R의 Shiny로 웹 애플리케이션 만들기

반응형 변수의 캐싱

  output$table <- renderTable({
      fit_model(input$num)
  })

  output$plot <- renderPlot({
      ggplot(
        fit_model(input$num), ...)
  })
  • fit_model()에 5초 소요
  • fit_model() 2회 호출 = 10초
x <- reactive({
    fit_model(input$num)
})

output$table <- renderTable({ x() })
output$plot <- renderPlot({ ggplot(x(), ...) })
  • x()는 두 번 호출되어도, x 내부 코드는 한 번만 실행됩니다
  • fit_model() 1회 호출 = 5초
사례 연구: R의 Shiny로 웹 애플리케이션 만들기

반응형 변수는 지연 평가됩니다

  • 지연 변수 = 필요할 때까지 계산하지 않음

    x <- reactive({
        fit_model(input$num)
    })
    
    output$download <- downloadHandler(
        filename = "x.csv",
        content = function(file) {
            write.csv(x(), file)
        }
    )
    
  • x()input$num이 바뀔 때마다가 아니라 다운로드 요청 시에만 실행됩니다

사례 연구: R의 Shiny로 웹 애플리케이션 만들기

Passons à la pratique !

사례 연구: R의 Shiny로 웹 애플리케이션 만들기

Preparing Video For Download...