我需要能够在闪亮的应用程序中并排添加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
答案 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))