如何将observeEvent中的值传递给另一个observeEvent?

bcs8qyzn  于 2023-02-20  发布在  其他
关注(0)|答案(2)|浏览(167)

我试图在shiny中将一个observeEvent中的赋值传递给另一个observeEvent,除了下面的代码,我还尝试使用my_dynamic_table(),但不幸的是我无法实现我的目标。
我的目标是如果my_dynamic_table不为空,则屏幕上显示“Something 1”。

library(shiny)
library(DT)

my_dynamic_table = data.frame(NA)

shinyApp(
  ui = fluidPage(
    actionButton("call","Call"),
    actionButton("save","Save"),
    verbatimTextOutput('text'), 
    DT::dataTableOutput('table_out')
  
  ),

  server = function(input, output, session) {
   

  observeEvent (input$call ,{
    
    my_dynamic_table <- mtcars
    
    output$table_out <- DT::renderDataTable(

                    my_dynamic_table            

                    ) # renderDataTable : table_out     

    })
    


   observeEvent (input$save,{
        
        output$text <- renderText({ 
                if(nrow(my_dynamic_table)>1) {

                        "Something 1"
                }else {
                        "Something 2"

                }

         }) #renderText

    }) #observeEvent

  } #server
) #shinyApp
8mmmxcuj

8mmmxcuj1#

实现这一点的一个选项是使用reactiveValreactiveValues

library(shiny)
library(DT)

shinyApp(
  ui = fluidPage(
    actionButton("call", "Call"),
    actionButton("save", "Save"),
    verbatimTextOutput("text"),
    DT::dataTableOutput("table_out")
  ),
  server = function(input, output, session) {
    my_dynamic_table <- reactiveVal(data.frame())
    
    observeEvent(input$call, {
      my_dynamic_table(mtcars)
      
      output$table_out <- DT::renderDataTable(
        my_dynamic_table()
      )
    })

    observeEvent(input$save, {
      output$text <- renderText({
        if (nrow(my_dynamic_table()) > 0) {
          "Something 1"
        } else {
          "Something 2"
        }
      }) # renderText
    }) # observeEvent
  } # server
) # shinyApp

qvtsj1bj

qvtsj1bj2#

虽然我确实认为使用reactiveValues是解决这个问题的一个好办法,但我得说在observeEvent()中使用output从来都不是一个好主意。我将如下重新安排代码。在observeEvent中,我们观察操作按钮,当单击时,更新reactiveValues。这些也是output的中间体。

library(shiny)
library(DT)

shinyApp(
  ui = fluidPage(
    actionButton("call","Call"),
    actionButton("save","Save"),
    verbatimTextOutput('text'), 
    DT::dataTableOutput('table_out')
    
  ),
  
  server = function(input, output, session) {
    
    my <- reactiveValues(dynamic_table = data.frame(NA),
                         text = NA)
    
    observeEvent(input$call, {
      
      my$dynamic_table <- mtcars
      
    })
    
    
    observeEvent(input$save, {
      
      if (nrow(my$dynamic_table) > 1) {
        my$text <- "Something 1"
      } else {
        my$text <-"Something 2"
      }
    }) 
    
    
    output$text <- renderText({
      req(input$save)
      my$text
      })
    
    output$table_out <- DT::renderDataTable({
      req(input$call)
      my$dynamic_table            
      
    }) 
    
  } #server
) #shinyApp

相关问题