2 min read

Shiny 데이터를 자동으로 갱신 시켜보자


출처: Shiny reactive Timer

Shiny에 데이터를 자동으로 갱신하는 법을 알아보자. 최근에 Shiny를 하게 되면서 필요한 기능중 하나. 어떻게 데이터를 자동으로 갱신 시켜서 샤이니에 띄울 것인가? 가장 단순하게 생각을 하자면 갱신 된 데이터를 가지고 Shiny를 다시 실행 시키면 된다. 그러나 Shiny를 담고 있는 코드가 많을때는 이보단 필요한 부분만 갱신을 할 수 있도록 하는기능이 있었으면 했는데, 그 기능이 Shiny에서 reactivetimer()라 할 수 있겠다.

global.R

global.R에는 if(interactive())함수를 통해 그 안에 ui.R, server.R를 감싸주도록 하자.

library(shiny)

if (interactive()) {
  source("./ui.R", local = TRUE)  
  source("./server.R", local = TRUE)  
}

ui.R

ui.R은 특별할게 없다. text로 현재 시간을 표시 해주기 위해서 단지 textOutput()함수만 넣어주자.

ui <- fluidPage(
  textOutput("time")
)

server.R

reactive Timer를 사용하기 위해 이부분이 가장 중요하다. 하나씩 알아보자.

  • 우선 reactiveTimer()설정을 해주어야 한다. 1000당 1초로 이번에는 2초로 설정 해주고 이를 autoInvalidate로 지정 해주었다.
  • 그리고 observe({}) 안에 autoInvalidate()를 넣어주어, 내부에서 로그를 확인할 수 있게 해주자.
  • 마지막으로 output$timer안에 autoInvalidate()함수를 넣어 주자. 이는 앞에서 앞에서 지정해준 autoInvalidate가 output$timer안에서 2초에 한번씩 적용을 하게끔 도와 준다.
server <- function(input, output) {
  
  autoInvalidate <- reactiveTimer(2 * 1000)
  
  observe({
    autoInvalidate()
  })
  
  output$time <- renderText({
    autoInvalidate()
    current_timer <- paste0("현재 시각은:",Sys.time(),"")
  })
}

그리고 나서 최종적으로 실행을 해주면 다음과 같이 2초마다 현재 시각이 바뀌는것을 볼 수 있다.

총평

개념을 찾는게 가장 어려웠다. reactive라는 개념을 미리 알았다면, 더 빠르게 알았을 기능. 단순하게 샤이니 자동, 샤이니 갱신, shiny auto~ 어쩌구 이렇게만 검색 하다보니 이렇게 오래 걸렸으나, 이 기능은 내가 생각하기에 앞으로도 자주 쓸 기능이라 이번에도 기억용으로 남겨 두려고 한다. 또한, 적당히 재미있는 주제로 shiny를 사용한 대시보드를 하나 만들어 보려고 하는데, 그때도 다시 한번 소개를 해보려 한다.