EDIT:我阅读了更多 jQuery 示例,并添加了一个代码片段,完成我认为您正在寻找的操作。
我不了解 jQuery,所以我无法从示例链接中获得太多信息。我猜测你想要什么,但我认为关键的想法是使用renderUI
and uiOutput
即使我的建议没有抓住重点。
要切换 ui 元素:
如果您特别不想使用shinyjs
,你可以这样做:
library(shiny)
ui <- shinyUI(fluidPage(
actionButton("btn", "Toggle Textbox"),
textOutput("btn_val"),
uiOutput("textbox_ui")
))
server <- shinyServer(function(input, output, session) {
output$btn_val <- renderPrint(print(input$btn))
textboxToggle <- reactive({
if (input$btn %% 2 == 1) {
textInput("textin", "Write something:", value = "Hello World!")
}
})
output$textbox_ui <- renderUI({ textboxToggle() })
})
shinyApp(ui, server)
添加和删除元素:
阅读了一些 jQuery 示例后,我认为这与您正在寻找的内容类似:
library(shiny)
ui <- shinyUI(fluidPage(
sidebarPanel(
actionButton("add_btn", "Add Textbox"),
actionButton("rm_btn", "Remove Textbox"),
textOutput("counter")
),
mainPanel(uiOutput("textbox_ui"))
))
server <- shinyServer(function(input, output, session) {
# Track the number of input boxes to render
counter <- reactiveValues(n = 0)
observeEvent(input$add_btn, {counter$n <- counter$n + 1})
observeEvent(input$rm_btn, {
if (counter$n > 0) counter$n <- counter$n - 1
})
output$counter <- renderPrint(print(counter$n))
textboxes <- reactive({
n <- counter$n
if (n > 0) {
lapply(seq_len(n), function(i) {
textInput(inputId = paste0("textin", i),
label = paste0("Textbox", i), value = "Hello World!")
})
}
})
output$textbox_ui <- renderUI({ textboxes() })
})
shinyApp(ui, server)
这种方法的问题在于,每次按下添加或删除按钮时,所有输入框都会重新呈现。这意味着您对它们的任何输入都会消失。
我认为您可以通过将输入框的当前输入值保存到reactiveValues
对象,并使用该对象将值设置为重新渲染的输入框的起始值value
选项中textInput
。不过,我现在将保留它的实现。