[英]R Shiny Dynamically add textinput and print ui output based on Userinput
我正在尝试创建一个 shiny 应用程序,该应用程序将使用户能够添加文本框,或添加图像并从中创建文档。 我可以添加一个文本框并显示其内容,但是当我添加另一个文本框时,内容不会显示。 我已使用链接作为起点。
这是我尝试通过单击添加按钮添加更多用户输入文本框的示例代码。
library(shiny)
library(shinyjqui)
ui <- shinyUI(fluidPage(
sidebarPanel(
actionButton("add_btn", "Add Textbox"),
actionButton("rm_btn", "Remove Textbox"),
textOutput("counter")
),
mainPanel(
jqui_sortable(
div(id = 'textboxes',
uiOutput("textbox_ui"),
textInput("caption", "Caption", "Insert Text"),
verbatimTextOutput("value")
)
)
)
))
server <- shinyServer(function(input, output, session) {
# Track the number of input boxes to render
counter <- reactiveValues(n = 0)
#Track the number of input boxes previously
prevcount <- reactiveValues(n = 0)
observeEvent(input$add_btn, {
counter$n <- counter$n + 1
prevcount$n <- counter$n - 1})
observeEvent(input$rm_btn, {
if (counter$n > 0) {
counter$n <- counter$n - 1
prevcount$n <- counter$n + 1
}
})
output$value <- renderText({ input$caption })
output$counter <- renderPrint(print(counter$n))
textboxes <- reactive({
n <- counter$n
if (n > 0) {
# If the no. of textboxes previously where more than zero, then
#save the text inputs in those text boxes
if(prevcount$n > 0){
vals = c()
if(prevcount$n > n){
lesscnt <- n
isInc <- FALSE
}else{
lesscnt <- prevcount$n
isInc <- TRUE
}
for(i in 1:lesscnt){
inpid = paste0("textin",i)
vals[i] = input[[inpid]]
}
if(isInc){
vals <- c(vals, "Insert Text")
}
lapply(seq_len(n), function(i) {
textInput(inputId = paste0("textin", i),
label = paste0("Subsection ", i), value = vals[i])
})
}else{
lapply(seq_len(n), function(i) {
textInput(inputId = paste0("textin", i),
label = paste0("Subsection ", i), value = "Insert text")
})
}
}
})
output$textbox_ui <- renderUI({ textboxes() })
})
shinyApp(ui, server)
在这方面的任何帮助将不胜感激。 如果有人能指出我每次添加新框时如何动态捕获 output$value,它将把我推向正确的方向。
您是否尝试过reactiveValuesToList
function? 这里有一个可能有帮助的例子
AllInputs <- reactive({
x <- reactiveValuesToList(input) })
textboxes <- reactive({
n <- counter$n
if (n > 0) {
isolate({
lapply(seq_len(n), function(i) {
textInput(inputId = paste0("textin", i),
label = paste0("Textbox", i),
value = AllInputs()[[paste0("textin", i)]])
})
})
}
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.