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를 사용한 대시보드를 하나 만들어 보려고 하는데, 그때도 다시 한번 소개를 해보려 한다.