ShinyApp :: Layout Inputs/Outputs
https://shiny.rstudio.com/reference/shiny/latest/
http://deanattali.com/blog/building-shiny-apps-tutorial/
http://cfss.uchicago.edu/shiny001_abc.html
UI Inputs
간단히, ui.R 에서 Input객체와 Output객체를 적절하게 배치하고,
server.R에서는 두 객체를 받아, 작성한 로직으로 프로세싱해서, 하나의 결과를 랜더링해준다.
(Id, Label, Value)
ui.R 랜더링하여 HTML (컴마주의) | server.R R코딩 | |
UI Inputs | UI Inputs (Update) | |
textInput , textAreaInput |
updateTextInput , updateTextAreaInput |
|
numericInput | updateNumericInput | |
dateInput , dateRangeInput |
updateDateInput , updateDateRangeInput |
|
checkboxInput, checkboxGroupInput, |
<input … type=”checkbox”> | updateCheckboxInput, updateCheckboxGroupInput |
radioButtons | updateRadioButtons | |
selectInput(selectizeInput) | updateSelectInput | |
sliderInput(animationOptions) | updateSliderInput | |
actionButton (actionLink) (submitButton) modalButton |
observeEvent and eventReactive | updateActionButton |
fileInput | ||
passwordInput | ||
getQueryString(getUrlHash) | updateQueryString | |
updateTabsetPanel (updateNavbarPage, updateNavlistPanel) |
checkboxInput, checkboxGroupInput
library(shiny) ui <- fluidPage( checkboxInput("checkYN", "Good", FALSE), verbatimTextOutput("checkVal"), checkboxGroupInput("variable", "Variables to show:", c("Cylinders" = "cyl", "Transmission" = "am", "Gears" = "gear")), tableOutput("data") ) server <- function(input, output, session) { output$checkVal <- renderText({ input$checkYN }) output$data <- renderTable({ mtcars[, c("mpg", input$variable), drop = FALSE] }, rownames = TRUE) } shinyApp(ui, server)
UI Outputs, Rendering functions
ui.R 랜더링하여 HTML (컴마주의) | server.R R코딩 | ||
UI Outputs | 설명 | Rendering functions | class명 |
textOutput | div 또는 span | renderText renderPrint |
shiny-text-output |
verbatimTextOutput | pre | ||
plotOutput (imageOutput) |
div 또는 span | renderPlot renderImage |
|
tableOutput (dataTableOutput) |
div | renderTable , renderDataTable |
shiny-html-output |
htmlOutput (uiOutput) |
div | renderUI | shiny-html-output |
downloadButton (downloadLink) |
div | downloadHandler | |
Progress withProgress(setProgress, incProgress) |
|||
modalDialog urlModal showModal (removeModal) |
|||
outputOptions |
Download Link
library(shiny) ui <- fluidPage( downloadLink("downloadData", "Download") ) server <- function(input, output) { dataSet <- mtcars output$downloadData <- downloadHandler( filename = function(){ paste("data-", Sys.Date(), ".csv", sep="") }, content = function(file){ write.csv(dataSet, file) } ) } shinyApp(ui, server)
progress
http://onesixx.com/shiny-progress/
library(shiny) ui <- fluidPage( plotOutput("plot") ) server <- function(input, output, session) { output$plot <- renderPlot({ # progress <- Progress$new(session, min=1, max=15) # on.exit(progress$close()) # progress$set(message = 'Calculation in progress', detail='This may take a while...') # for (i in 1:15) { # progress$set(value = i) # Sys.sleep(0.25) # } withProgress( message = 'Calculation in progress', detail = 'This may take a while...', value = 0, { for (i in 1:15) { incProgress(1/15) Sys.sleep(0.25) } } ) plot(cars) }) } shinyApp(ui, server)
modalDialog, showModal
library(shiny) ui <- fluidPage( actionButton("show", "Show modal dialog") ) server <- function(input, output, session) { observeEvent(input$show, { showModal( modalDialog(title="Important message", "This is an important message!") ) }) } shinyApp(ui, server)
UI Layout함수
Page – Layout- Panel
Page함수 | Layout 함수 | Panel함수 |
navbarPage (navbarMenu) fluidPage (fluidRow) fixedPage (fixedRow) |
sidebarLayout | titlePanel sidebarPanel, mainPanel tabsetPanel navlistPanel tabPanel |
bootstrapPage (basicPage) fillPage pageWithSidebar |
flowLayout splitLayout verticalLayout |
headerPanel inputPanel wellPanel helpText absolutePanel(fixedPanel) conditionalPanel |
column fillRow (fillCol) icon withMathJax |
예제
http://www.htmlwidgets.org/showcase_datatables.html
htmlwidgets을 핵심내용으로 사용.
https://gist.github.com/ChrisBeeley/6571951
http://shiny.rstudio.com/gallery/widget-gallery.html
> runGist(6571951)
### data Types – ui.R library(shiny) shinyUI(pageWithSidebar( headerPanel("Widget values and data types"), sidebarPanel( checkboxGroupInput( inputId = "checkGroup", label = "1. checkboxGroupInput", choices = list("Ice cream" = "IC", "Trifle" = "Trifle","Pistachios" = "Pist") ), checkboxInput( inputId = "boxInput", label = "2. checkboxInput" ), dateInput( inputId = "theDate", label = "3. dateInput" ), dateRangeInput( inputId = "dateRange", label = "4. dateRangeInput" ), numericInput( inputId = "pickNumber", label = "5. numericInput", min = 1, max = 10, value = 1 ), radioButtons( inputId = "pickRadio", label = "6. radioButtons", choices = list("Taxi" = "Taxi", "Take a walk" = "Walk") ), selectInput( inputId = "comboBox", label = "7. selectInput", choices = list("News" = "News", "Situation comedy" = "Sitcom", "Film" = "Film") ), sliderInput( inputId = "slider", label = "8. sliderInput", min = 1, max = 10, value = 7, step = 1 ), textInput( inputId = "comment", label = "9. textInput", value = "" ) ), mainPanel( h3("Output and data type"), tableOutput("textDisplay") ) ))
##### data types and values – server.R ### library(shiny) shinyServer(function(input, output){ output$textDisplay <- renderTable({ getMat = matrix( c( paste(input$checkGroup, collapse=','), class(input$checkGroup), input$boxInput, class(input$boxInput), as.character(as.Date(input$theDate, origin = "1970-01-01")), class(input$theDate), paste(as.character(as.Date(input$dateRange[1], origin = "1970-01-01")), as.character(as.Date(input$dateRange[2], origin = "1970-01-01")), collapse = ','), class(input$dateRange), input$pickNumber, class(input$pickNumber), input$pickRadio, class(input$pickRadio), input$comboBox, class(input$comboBox), input$slider, class(input$slider), input$comment, class(input$comment) ), ncol=2, byrow = TRUE) colnames(getMat) = c("Value", "Class") getMat }) })
Reactive programming
저장 : Store values | reactiveValues | makeReactiveBinding reactiveVal reactiveValuesToList is.reactivevalues |
계산 : Calculate values | reactive (is.reactive) | observeEvent (eventReactive) |
실행 : Execute tasks | observe | |
대기 : Preventing reactivity | isolate | |
Checking pre-conditions ( Check for required values) |
Utility functions :: req | |
Time (as a reactive source) | invalidateLater | reactiveTimer |
Rate-limiting | debounce (throttle) | |
Live data | reactiveFileReader | reactivePoll |
showReactLog domains (getDefaultReactiveDomain, withReactiveDomain, onReactiveDomainEnded) |