Advanced topics2 – Create re-usable UI elements

Published by onesixx on

http://zevross.com/blog/2016/04/19/r-powered-web-applications-with-shiny-a-tutorial-and-cheat-sheet-with-40-example-apps/  Posted on  by [email protected] 

Create re-useable UI elements

여러 tab에 같은 UI element를 넣어야할때, (10개의 tab에 변수선택을 위한 같은 selectbox를 구현하고 싶을때)
같은 코드를 여러번 copy&paste한다면 각각 ID도 따로 생성해야  하고 수정에 대한 관리도 어려워 질것이다.

=>  필요한 UI element를 output하는 function 을 만들고, 간단히 call하면 된다. 
       (물론 modules을 사용할수도 있겠지만)

 

renderUI in server ,  htmlOutput(uiOutput) in ui

renderUI  예제

https://shiny.rstudio.com/reference/shiny/0.14/renderUI.html   (Rendering functions)

기본

server <- function(input, output, session) {
    output$moreControls <- renderUI({
        tagList(
            sliderInput("n", "N", 1, 1000, 500),
            textInput("label", "Label")
        )
    })
}

ui <- basicPage(
    #uiOutput("moreControls")
    htmlOutput("moreControls")
)

shinyApp(ui, server)

함수

server <- function(input, output, session) {
    button_Action <- function(){
        output$moreControls <- renderUI({
            tagList(
                sliderInput("n", "N", 1, 1000, 500),
                textInput("label", "Label")
            )
        })
    }
    
    observeEvent(input$btn_action, {
        button_Action()
    })
}

ui <- basicPage(
    actionButton("btn_action", "Button"),
    htmlOutput("moreControls")
)

shinyApp(ui, server)

do.call 

server <- function(input, output, session) {
    button_Action <- function(){
        output$moreControls <- renderUI({
            output_list <- lapply(c(1:3), function(x){
                    tagList(
                        sliderInput(paste0("n",x), paste0("N",x), 1, 1000, 500),
                        textInput(paste0("label",x), paste0("LABEL",x))
                    )
            })
            do.call(tagList, output_list)
        })
    }
    
    observeEvent(input$btn_action, {
        button_Action()
    })
}

ui <- basicPage(
    actionButton("btn_action", "Button"),
    htmlOutput("moreControls")
)

shinyApp(ui, server)

 

renderUI  예제2 : Create re-usable UI elements

ex) title, select box, radio button, check box를 생성하는 function(아래예 createSelectRadio() ) 을 생성하고, 
       각 tab에서 해당 function을 3번 call하면, components의 list를 output한다. App 28

server <- function(input, output, session) {
    
    # A function to create a block of UI elements
    createSelectRadio <- function(id, title){
        selectID <- paste0("myselect", id)
        radioID  <- paste0("myradio",  id)
        checkID  <- paste0("mycheck",  id)
        res <- list(
            h2(title),
            selectInput(  inputId = selectID, label="", choices = sample(LETTERS,3)),
            radioButtons( inputId = radioID,  label="", choices = sample(letters,3)),
            checkboxInput(inputId = checkID,  label="", value=TRUE)
        )
        return(res)
    }
    
    # here we create our blocks of UI elements by running the function
    output$forPlot    <- renderUI({createSelectRadio(1, "In plot tab")})
    output$forSummary <- renderUI({createSelectRadio(2, "In summary tab")})
    output$forTable   <- renderUI({createSelectRadio(3, "In table tab")})
    
}

ui <- basicPage(
    h3("All tabs have the same set of components created with a function."),
    
    tabsetPanel(
        tabPanel("Summary", uiOutput("forSummary")), 
        tabPanel("Plot",    uiOutput("forPlot")), 
        tabPanel("Table",   uiOutput("forTable"))
    )
)

shinyApp(ui, server)

 

Categories: Shiny

onesixx

Blog Owner

Leave a Reply

Your email address will not be published.