修改R Shiny中的动态输入代码

时间:2016-03-21 20:57:01

标签: r shiny

所以几天前我问过以下问题R Shiny Dynamic Input,虽然答案是正确的,但我现在想详细说明一下,因为我无法编辑给出的代码来回答我的问题。题。所以最初我希望能够要求用户指定一个数字,比如k,然后动态生成k字段供用户填写。现在,给出的代码假定输出是数字,但是,我希望用户能够在1,...,k字段的每一个中指定5个值的向量。因为,在指定k之后,输入将是数值长度为5的k个向量,我希望能够将这些值存储在k×5矩阵中。这样我可以使用这些值来稍后进行数据处理。如果有帮助,这里是原始答案的代码:

library(shiny)

ui <- shinyUI(fluidPage(
  titlePanel("Old Faithful Geyser Data"),

  sidebarLayout(
    sidebarPanel(
      numericInput("numInputs", "How many inputs do you want", 4),
      # place to hold dynamic inputs
      uiOutput("inputGroup")
    ),
    # this is just a demo to show the input values
    mainPanel(textOutput("inputValues"))
  )
))

# Define server logic required to draw a histogram
server <- shinyServer(function(input, output) {
  # observe changes in "numInputs", and create corresponding number of inputs
  observeEvent(input$numInputs, {
    output$inputGroup = renderUI({
      input_list <- lapply(1:input$numInputs, function(i) {
        # for each dynamically generated input, give a different name
        inputName <- paste("input", i, sep = "")
        numericInput(inputName, inputName, 1)
      })
      do.call(tagList, input_list)
    })
  })

  # this is just a demo to display all the input values
  output$inputValues <- renderText({
    paste(lapply(1:input$numInputs, function(i) {
      inputName <- paste("input", i, sep = "")
      input[[inputName]]
    }))
  })

})

# Run the application
shinyApp(ui = ui, server = server)

修改

以下是仍然无法完成的更新代码:

library(shiny)

ui <- shinyUI(fluidPage(
  titlePanel("Old Faithful Geyser Data"),

  sidebarLayout(
    sidebarPanel(
      numericInput("numInputs", "How many inputs do you want", 4),
      # place to hold dynamic inputs
      uiOutput("inputGroup")
    ),
    # this is just a demo to show the input values
    mainPanel(tableOutput("inputValues"))
  )
))

# Define server logic required to draw a histogram
server <- shinyServer(function(input, output) {
  # observe changes in "numInputs", and create corresponding number of inputs
  observeEvent(input$numInputs, {
output$inputValues <- renderTable({
  all <- paste(lapply(1:input$numInputs, function(i) {
    inputName <- paste("input", i, sep = "")
    input[[inputName]]
  }))
  matrix <- as.matrix(all, ncol=5)
  as.data.frame(matrix)
})

  })

  # this is just a demo to display all the input values
  output$inputValues <- renderText({
    paste(lapply(1:input$numInputs, function(i) {
      inputName <- paste("input", i, sep = "")
      input[[inputName]]
    }))
  })

})

# Run the application
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:1)

您只需进行一些更改:

  1. $(document).ready(function() { $('a,input').bind('touchend', function() {}); }); 更改为mainPanel(textOutput("inputValues"))(这不是必需的,它只是以表格/矩阵格式显示值,以便您可以看到它们)
  2. mainPanel(tableOutput("inputValues"))更改为numericInput(inputName, inputName, 1)
  3. textInput(inputName, inputName, "1 2 3 4 5")更改为

    output$inputValues <- renderText({......
  4. output$inputValues <- renderTable({ all <- paste(lapply(1:input$numInputs, function(i) { inputName <- paste("input", i, sep = "") input[[inputName]] })) matrix = as.matrix(read.table(text=all)) data.frame(matrix) }) 就是你想要的:一个k乘5矩阵。

    请注意,我没有进行任何输入验证。假设用户将在每个输入中输入由空格分隔的5个数字。如果他们不这样做,输出可能是错误的,或者您会看到错误。您可能需要在此处实施一些输入检查以确保它是5个数字而不是其他任何内容。

    完整代码

    matrix