샤이니 코드들이 실행되는 과정을 머릿속에 하나의 그림으로 담고 있는것이 좋다. 그 과정은 일반적인 웹 페이지들의 실행과정과 거의 유사하다. 샤이니 패키지에 내장되어 있는 "04_mpg"라는 앱을 단일 파일 앱으로 만들고, 이 앱을 가지고 설명한다!
> library(shiny)
> library(datasets)
> mpgData <- mtcars
> mpgData$am <- factor(mpgData$am, labels = c("Automtic","Manual"))
> ui <- fluidPage(
+ titlePanel("Miles Per Gallon"),
+ sidebarLayout(
+ sidebarPanel(
+ selectInput("variable","Variable:",
+ c("Cylinders"="cyl",
+ "Transmission"="am",
+ "Gears" = "gear")),
+
+ checkboxInput("outliers","Show outliers",FALSE)
+ ),
+ mainPanel(
+ h3(textOutput("caption")),
+
+ plotOutput("mpgPlot")
+ )
+ )
+ )
> server <- function(input,output){
+ formulaText <- reactive({
+ paste("mpg~",input$variable)
+ })
+ output$caption <- renderText({
+ formulaText()
+ })
+
+ output$mpgPlot <- renderPlot({
+ boxplot(as.formula(formulaText()),
+ data = mpgData,
+ outline = input$outliers)
+ })
+ }
> shinyApp(ui,server)
이 앱을 실행하면, 샤이니 코드들이 앞에서 순차적으로 실행된다. 필요한 라이브러리를 로딩하고 데이터를 준비한다.
> library(shiny)
> library(datasets) #datasets, shiny 라이브러리 로딩
> mpgData <- mtcars #mtcars 값을 mpgData에 넣음.
> mpgData$am <- factor(mpgData$am, labels = c("Automtic","Manual")) #??
ui와 server 객체를 얻는다.
> ui <- fluidPage(...)
> server <- function(input,output) {...} #input,output을 만들어 {}안에 있는 명령어 실행
ui 객체와 server 객체를 합쳐서 샤이니 앱 객체를 만든다.
shinyApp(ui,server)
그러면 앱이 실행 되는데, 이 과정까지는 선형적(synchronous)이라 할 수 있다. 그런 다음에는 사용자의 값에 반응하는 단계로 접어든다. 일반적인 웹 페이지에서는 이것을 이벤트 루프가 작동한다고 설명하고, 샤이니 앱에서는 반응성 체인이 작동한다고 흔히 이야기 한다. 사용자가 어떤 값을 입력하면 이것이 반응성 값으로 연결되고, 이 반응성 값을 사용하는 코드들은 모두 반응성 체인으로 연결되어 실행된다. 사용자가 어떤 값을 선택할지 사전에 알 수 있는 것은 아니므로, 이런 상황에 대체할 수 있어야 한다.
그래서 이 과정은 근본적으로 비선형적이다. 이 과정은 앱이 종료될 때까지 지속된다.
샤이니 앱이 실행되고 있을 때, 특정 시점에서 샤이니 앱이 가지고 있는 정보를 '상태'라고 부른다. 이를테면 현재 input$sel에 할당된 값은 상태에 해당한다. 샤이니에서 상태는 북마킹(bookmarking) 이라고 불리는 방법으로 처리한다. 북마킹 기술에 대해서는 뒤에서 설명한다.
정리하자면 UI와 샤이니 서버 함수 밖의 코드는 처음 샤이니가 시작될 때 단지 1회만 실행된다. 반면 UI 와 샤이니 함수 안의 코드들은 여러 번 반복하게 된다.
'전공 > R프로그래밍' 카테고리의 다른 글
R프로그래밍 25. 샤이니 앱의 기본 틀 (0) | 2019.08.26 |
---|---|
R 프로그래밍 24. 스콥과 시야(visibility) (0) | 2019.08.26 |
R프로그래밍 22. R 세션과 options() (2) | 2019.08.19 |
R프로그래밍 21. 샤이니에서 유용한 함수들 (0) | 2019.08.16 |
R프로그래밍 20. R에서 파일 다루기 (0) | 2019.08.14 |