如何在闪亮的应用程序中动态添加inputText?

时间:2016-03-22 16:31:03

标签: r shiny

我需要能够在闪亮的应用程序中并排添加textInput()。应该有一个textInput(),它接受新文本框和命令按钮的标签,每次点击命令按钮时,都应该在列表中添加一个新的文本框,其中应该从第一个txtInput中获取标签。

例如:

1stTextBox:[   Application   ]
{commandButton}

当我单击commandButton时,我应该在commandButton下面有一个textInput,

Application:[      ]

如果我将其他东西放到1stTextBox并单击命令按钮,则应将其添加到textInput列表中。

任何想法怎么能动态地发光?

这是错误:

Listening on http://127.0.0.1:3091
Warning: Error in handlers$add: Key / already in use
Stack trace (innermost first):
    43: handlers$add
    42: handlerManager$addHandler
    41: startApp
    40: runApp
     1: shiny::runApp
Error in handlers$add(handler, key, tail) : Key / already in use

1 个答案:

答案 0 :(得分:1)

我给出了一个示例代码。要尝试此操作,请复制脚本并运行整个脚本。

我正在使用reactiveValues对象将信息保存在后端。 这里,info_keeper$input_info是一个列表,其中每个元素应该是[id,label,value]的3长字符向量。

单击该按钮时,(1)存储已定义的textInputs的内容; (2)添加新元素。

我使用的isolate可能超过必要,以避免不必要的行为。

library(shiny)

ui <- list(
  textInput("name", "Type new text input name", value = ""),
  actionButton("btn", "click me to create text input"),
  uiOutput("newInputs")
)

server <- function(input, output)
{
  info_keeper <- reactiveValues(
    input_info = list()
  )

  observeEvent(input$btn, {
    # copy the current contents to info_keeper
    isolate(
    {
      for (i in seq_along(info_keeper$input_info))
      {
        id <- info_keeper$input_info[[i]][1]
        info_keeper$input_info[[i]][3] <- input[[id]]
      }
    })

    # add new text input to the info_keeper
    isolate(
    {
      newid <- paste(
        "text", isolate(length(info_keeper$input_info)) + 1, sep = "")
      info_keeper$input_info <- c(
        info_keeper$input_info, list(c(newid, input$name, "")))
    })

    # invoke the update of the text inputs
    info_keeper
  })

  output$newInputs <- renderUI({
    lapply(info_keeper$input_info, function(a)
      textInput(a[1], a[2], value = a[3]))
  })
}

runApp(list(ui = ui, server = server))