【问题标题】:For loop in observe Event观察事件中的for循环
【发布时间】:2021-07-05 11:54:44
【问题描述】:

我正在尝试为数据表中的所有行创建一个操作按钮(这只是一个示例。但实际表包含很多行)。因为,我已经硬编码了观察事件。因为我在这里面临一些问题。我现在得到的输出只有在单击第一行操作按钮时才会触发观察事件,但我需要在单击所有行时触发此触发器。 (基本上是一个for循环)

library(shiny)
library(shinydashboard)
library(DT)
library(glue)
number_compare <- data.frame(replicate(2, sample(1:100, 10, rep=TRUE)))


sidebar <- dashboardSidebar()

body <- dashboardBody(
  fluidRow(box(width = 12, solidHeader = TRUE,
               DTOutput("example_table"))
  )
)

ui <- dashboardPage(dashboardHeader(title = "Example"),
                    sidebar,
                    body
)


server <- function(input, output) {
  

  
  number_compare <- number_compare %>% mutate(rn = row_number(), button = glue::glue(HTML('<button id="button{rn}" type="button" class="btn btn-default action-button">Ask a question</button>')))
  
  output$example_table <- DT::renderDT({
    datatable(
      number_compare,
      escape = FALSE
      ,options=list(preDrawCallback=JS(
        'function() {
     Shiny.unbindAll(this.api().table().node());}'),
        drawCallback= JS(
          'function(settings) {
       Shiny.bindAll(this.api().table().node());}')))
  })
  
  observeEvent(input[[paste0("button",number_compare["rn"][1,])]],{
  print("Cleicked")
  })

  
  
  
}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    根据docsobserveEvent()

    eventExpr 表示事件的(带引号或不带引号的)表达式;这可以是一个简单的响应式值(例如 input$click)、对响应式表达式(例如 dataset() 的调用),甚至是花括号内的复杂表达式

    试试这个:

    observeEvent({
        for (...) {
          input[[...]]
        }
      }, {
        print("Cleicked")
      })
    

    【讨论】:

      【解决方案2】:

      您可以使用lapply 来满足您的需求。一种方法是

        lapply (1:nrow(number_compare), function(i) {
          observeEvent(input[[paste0("button",i)]],{
            print("Clicked")
          })
          
        })
      

      另一种方法是

       observeEvent({
          lapply (1:nrow(number_compare), function(i) {input[[paste0("button",i)]]})
          }, {
            print("Clicked")
        })
      

      根据您的用例,这两种方法中的一种可能更有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多