【问题标题】:How to identify which observer is being triggered in Shiny when multiple dynamic observers are in use当使用多个动态观察者时,如何识别在 Shiny 中触发了哪个观察者
【发布时间】:2019-03-31 06:59:33
【问题描述】:

我在选项卡中生成了一组动态 UI 表单。我使用动态观察事件来检查正在保存的表单。 请看下面的代码

library(shiny)

ui <- fluidPage(
  actionButton("generate_tab","Generate Tabs"),
  tabsetPanel(id="tabs",
              uiOutput('tabsN')),
  dataTableOutput("saved_tabs_output")
)

server <- function(input, output, session) {
  rv<- reactiveValues(no_of_tabs =0)

  #generating the UI dynamically
 observeEvent(input$generate_tab,{
   rv$no_of_tabs <- rv$no_of_tabs + 1
   appendTab(inputId = "tabs", 
             tabPanel(title = paste0("Tab_",rv$no_of_tabs),
             selectInput(paste0("Input",rv$no_of_tabs),paste0("Input",rv$no_of_tabs), choices = c('',LETTERS), selected = NULL),
             actionButton(paste0("submit_input",rv$no_of_tabs),"submit input")
             )
   )})

# Reading the inputs upon clicking of Submit Input in each tab
   #dynamic Observe Event needs to be set up dependent on number of Tabs (rv$no_of_tabs)

   observeEvent(lapply(paste0("submit_input",1:rv$no_of_tabs), function(x){input[[x]]

   }
   ),{
     rv$inputs <-sapply(paste0("Input",1:rv$no_of_tabs), 
                        function(x)input[[x]])

        },ignoreInit = TRUE  )



   output$saved_tabs_output <- renderDataTable({
     as.data.frame(rv$inputs) 
   })


}

shinyApp(ui, server)

因为在一个 observeEvent lapply 公式中检查了多次提交按钮点击,所以它也接受来自未提交表单的输入。这是一个例子

第 1 步:点击 Generate tabs 4 次以生成 Tab1、Tab2、Tab3、Tab 4。单击 Tab 1

第 2 步:在选项卡 1 中选择 B。不要按提交

第 3 步:在选项卡 4 中选择 D 并点击 Submit

期望的输出是只更新 Input4 而不是 input1,但是在这种情况下,B 和 D 都被保存。关于如何解决这个问题的任何指示?

【问题讨论】:

  • 如果你只有一个观察者来处理动态创建的元素的所有点击会容易得多。看看这两个例子herehere

标签: r shiny lapply reactive


【解决方案1】:

Geovany 的评论有所帮助。这个link 也帮助了我。 诀窍是只将一个观察者与每个提交按钮相关联。

这是有效的代码,以防它对任何人有用

library(shiny)
library(purrr)
options(shiny.reactlog = TRUE)
ui <- fluidPage(
  actionButton("generate_tab", "Generate Tabs"),
  tabsetPanel(id = "tabs",
              uiOutput('tabsN')),
  verbatimTextOutput("rvInput")

)

server <- function(input, output, session) {
  # browser()
  rv <- reactiveValues(no_of_tabs = 0L,
                       inputs = list()
                       )

  #generating the UI dynamically
  observeEvent(input$generate_tab, {
    rv$no_of_tabs <- rv$no_of_tabs + 1
    appendTab(inputId = "tabs",
              tabPanel(
                title = paste0("Tab_", rv$no_of_tabs),
                selectInput(
                  paste0("Input", rv$no_of_tabs),
                  paste0("Input", rv$no_of_tabs),
                  choices = c('', LETTERS),
                  selected = NULL
                ),
                actionButton(paste0("submit_input", rv$no_of_tabs), "submit input")
              ))
  })

  observe({
    lapply(1:rv$no_of_tabs, function(x) {
      observeEvent(input[[paste0("submit_input", x)]], {
        rv$inputs[[x]] <- input[[paste0("Input", x)]]
      })
    })
  })

  output$rvInput <- renderPrint({
    rv$inputs
  })

}

shinyApp(ui, server)

【讨论】:

    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多