R闪亮:如何构建动态UI(文本输入)

时间:2014-03-04 00:19:39

标签: r textinput shiny

我正在尝试使用R shiny构建动态textInput。用户应该在文本字段中写入,然后按下添加按钮以填充另一个字段。但是,每次按下按钮时,所有字段都变为空,就像我必须提前定义我想要的字段数一样。任何帮助将非常感激。

谢谢

这是我的代码:

library(shiny)

shiny::runApp(list(
ui = pageWithSidebar(
headerPanel("test"),
sidebarPanel(
  helpText("Alternatives list"),
  verbatimTextOutput("summary")
),    
mainPanel(  
  actionButton("obs","add"),
  htmlOutput("selectInputs")     
)  
)
, 

server = function(input,output){
observe({

  if (input$obs == 0) 
    return()
  isolate({

    output$selectInputs <- renderUI({
      if(!is.null(input$obs))  
        print("w")
      w <- ""
      for(i in 1:input$obs) {
        w <- paste(w,textInput(paste("a",i,sep=""),paste("a",i,sep="")))
      }
      HTML(w)
    })
    output$summary <- renderPrint({  
      print("your Alternative are:")

      for(i in 1:input$obs) {
        print(              
          input[[sprintf("a%d",i)]]
        )
      }
    })
    outputOptions(output, 'selectInputs', suspendWhenHidden=FALSE)
  })
})
}))

1 个答案:

答案 0 :(得分:6)

您的问题是每次单击按钮时都会重新生成所有按钮(因此输入$ aX)。并且它们默认生成时没有值,这就是为什么当你读它们时它们都是空的。

例如,如果你在output$selectInputs代码中压制循环,你可以看到你的错误:(但现在它只允许你设置每个aX只有一次。)

    output$selectInputs <- renderUI({
      if(!is.null(input$obs))
        print("w")
      w <- ""
      w <- paste(w, textInput(paste("a", input$obs, sep = ""), paste("a", input$obs, sep = "")))
      HTML(w)
    })

保持你的代码(然后保持所有按钮的重生),你应该添加每个textInput的值参数他的“自己的值”(实际上,具有相同id的旧输入的值){{1 }}:

value = input[[sprintf("a%d",i)]]