2016-08-28 8 views
0

에 의해 새로운 오래된 탭을 대체하는 것은 기존의 예를, 어떻게 여기 selectInpout

library(shiny) 
runExample("06_tabsets") 

입니다 그리고 당신은 당신이 라디오 버튼의 분포 유형을 선택할 수 있습니다 볼 수와 세 개의 탭이 "음모", "요약이 있습니다 "및"표 ".

제 질문은 sliderInput (관측 수)에 selectInput을 두 개의 값으로 추가하는 방법입니다. 기본값은 "NULL"이고 두 번째 것은 "1"입니다. 사용자가 "1"을 선택하면 이전 세 탭이 사라집니다. 대신 새 탭에 내용이 무엇이든지 표시됩니다.

+1

. 그렇게하면'selectInput'에 종속되어 입력에 따라 다른 UI를 렌더링 할 수 있습니다. –

답변

1

수정 된 "06_tabsets"입니다. 선택 입력이 추가되고 선택에 따라 UI가 생성됩니다. 유일한 차이점은 NULL을 사용하지 않고 두 가지 옵션을 사용한다는 것입니다. 내가 NULL로 실행할 수 있습니다. 이것이 도움이되는지 알려주십시오.

ui.R

library(shiny) 

    # Define UI for random distribution application 
    shinyUI(fluidPage(

      # Application title 
      titlePanel("Tabsets"), 

      # Sidebar with controls to select the random distribution type 
      # and number of observations to generate. Note the use of the 
      # br() element to introduce extra vertical spacing 
      sidebarLayout(
        sidebarPanel(
          radioButtons("dist", "Distribution type:", 
             c("Normal" = "norm", 
              "Uniform" = "unif", 
              "Log-normal" = "lnorm", 
              "Exponential" = "exp")), 
          br(), 

          sliderInput("n", 
             "Number of observations:", 
             value = 500, 
             min = 1, 
             max = 1000), 
          selectInput("contentSelect", "Select content to dislay:", choices = c("1", "2"), selected = 1) 
        ), 

        # Show a tabset that includes a plot, summary, and table view 
        # of the generated distribution 
        mainPanel(
          uiOutput("content") 
        ) 
      ) 
    )) 

server.R

동적으로 서버 측에서`renderUI`를 사용하여 탭을 생성하는 것입니다 당신이해야 할
library(shiny) 

    # Define server logic for random distribution application 
    shinyServer(function(input, output) { 

      # Reactive expression to generate the requested distribution. 
      # This is called whenever the inputs change. The output 
      # functions defined below then all use the value computed from 
      # this expression 
      data <- reactive({ 
        dist <- switch(input$dist, 
            norm = rnorm, 
            unif = runif, 
            lnorm = rlnorm, 
            exp = rexp, 
            rnorm) 

        dist(input$n) 
      }) 

      # Generate a plot of the data. Also uses the inputs to build 
      # the plot label. Note that the dependencies on both the inputs 
      # and the data reactive expression are both tracked, and 
      # all expressions are called in the sequence implied by the 
      # dependency graph 

      output$plot <- renderPlot({ 
        dist <- input$dist 
        n <- input$n 

        hist(data(), 
         main=paste('r', dist, '(', n, ')', sep='')) 
      }) 

      # Generate a summary of the data 
      output$summary <- renderPrint({ 
        summary(data()) 
      }) 

      # Generate an HTML table view of the data 
      output$table <- renderTable({ 
        data.frame(x=data()) 
      }) 
      output$textA <- renderText({ 
        paste(input$contentSelect, " A") 
      }) 

      observeEvent(input$contentSelect, { 
        if (input$contentSelect == "1") { 
          output$content <- renderUI({ 
            tabsetPanel(type = "tabs", 
               tabPanel("Plot", plotOutput("plot")), 
               tabPanel("Summary", verbatimTextOutput("summary")), 
               tabPanel("Table", tableOutput("table")) 
            ) 
          })  
        } else { 
          output$content <- renderUI({ 
            tabsetPanel(type = "tabs", 
               tabPanel("A", textOutput("textA")) 
            ) 
          })  
        } 
      }) 


    }) 
+0

좋은 답변입니다. 나는 그것을 알아 냈다. 그건 그렇고, 가장 중요한 코드는 observeEvent() 함수라고 생각합니다. 어떤 상황에서 우리가 observeEvent를 사용해야하는지 직감을 줄 수 있습니까? –

+0

은 일반적으로 함수로 간주되어 값을 반환하는 리 액티브 (또는 reactiveEvent)와 달리 부작용을 만듭니다. 따라서 부작용 (콘솔로 출력, 파일 다운로드, UI 렌더링 ...)을하려면 관찰을 사용하십시오. observeEvent는 일반적으로 부작용을 만들려고하지만 관찰 이벤트의 본문에 다른 반응이있는 경우 하나의 특정 이벤트에 의해 트리거 될 때 사용됩니다. 일반적인 예제는 actionButton 일 것입니다. RStudio에서 @JoeCheng의 비디오를 확인하십시오 : [리 액티브 프로그래밍] (https://www.rstudio.com/resources/webinars/shiny-developer-conference/) –

+0

observeEvent를 사용해야합니까? observeEvent 함수를 제거하면 생각합니다. 단지 (입력 $ contentSelect == "1") { 출력 $ content <- renderUI ({...... 그럴 수도 있습니다. –