具有多个输入的闪亮renderUI

时间:2017-02-10 22:01:27

标签: r shiny

My Shiny App有多个输入,取决于使用的变量数量。简化版本虽然不起作用,但如下所示。我能够使用一个名为Make.UI的函数基于numericInput来更新UI,我用它来制作uiOutput,但是将输入返回到服务器中超出了我的Shiny技能组合!任何建议都将不胜感激。

格温

library(shiny)
D = matrix(runif(400), nrow = 20)
colnames(D) = labs = sapply(1:20, function(i) {paste0("col",i)})

# Define UI for application that summarises data
ui <- fluidPage(

  # Application title
  titlePanel("Summaries"),

  # Select columns to get fed into summary 
  tabsetPanel(
    tabPanel("Matching Variables Info",
             sidebarPanel(

               numericInput("NoVars","No. of variables to summarize", 
                            value = 3, min = 2, max = dim(D)[2]),

               uiOutput("VarsInput")
             ),

             # Show summaries of columns choosen above
             mainPanel(
               verbatimTextOutput("dataInfo")
             )
    )
  )
)


# Define the server code
server <- function(input, output){

  Make.UI <- function(NoV){
    C = sapply(1:NoV, function(i){paste0("cols",i)})
    L = sapply(1:NoV, function(i){paste0("label",i)})

    output = tagList()

    for(i in seq_along(1:NoV)){
      output[[i]] = tagList()
      output[[i]][[1]] = selectInput(C[i], "Variable to summarize:", labs)
      output[[i]][[2]] = textInput(L[i], label = "Label for variable:", 
                                   value = "Label for variable Here")
    } ## for loop

    output
  } # closes Make.UI function

  K <- reactive({
    input$NoVars
  })

  output$VarsInput <- renderUI({
    Make.UI(K())
  })

  output$dataInfo <- renderPrint({
    C <- sapply(1:K(), function(i) {input[[paste0("cols",i)]]})
    ## the code in the line above doesn't work

    summary(D[, C()])
  })

}

# Return a Shiny app object
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:4)

就像我在第一条评论中写的那样,我不确定Make.UI()函数。如果你真的想把它作为一个单独的功能,你应该让它反应。或者像我在下面的代码中那样使用它。 此外,在output$dataInfo <- renderPrint({ C中不是reactive()函数,因此您需要删除括号。

library(shiny)
D = matrix(runif(400), nrow = 20)
colnames(D) = labs = sapply(1:20, function(i) {paste0("col",i)})

# Define UI for application that summarises data
ui <- fluidPage(

  # Application title
  titlePanel("Summaries"),

  # Select columns to get fed into summary 
  tabsetPanel(
    tabPanel("Matching Variables Info",
             sidebarPanel(

               numericInput("NoVars","No. of variables to summarize", 
                            value = 3, min = 2, max = dim(D)[2]),

               uiOutput("VarsInput")
             ),

             # Show summaries of columns choosen above
             mainPanel(
               verbatimTextOutput("dataInfo")
             )
    )
  )
)


# Define the server code
server <- function(input, output){

  K <- reactive({
    input$NoVars
  })

  output$VarsInput <- renderUI({
    NoV = K()
    C = sapply(1:NoV, function(i){paste0("cols",i)})
    L = sapply(1:NoV, function(i){paste0("label",i)})

    output = tagList()

    for(i in seq_along(1:NoV)){
      output[[i]] = tagList()
      output[[i]][[1]] = selectInput(C[i], "Variable to summarize:", labs)
      output[[i]][[2]] = textInput(L[i], label = "Label for variable:", 
                                   value = "Label for variable Here")
    } ## for loop

    output
  })

  output$dataInfo <- renderPrint({
    C <- sapply(1:K(), function(i) {input[[paste0("cols",i)]]})
    ## the code in the line above doesn't work

    summary(D[, C])
  })

}

# Return a Shiny app object
shinyApp(ui = ui, server = server)