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) |