如何从另一个观察事件中访问数据帧



示例:

UI。R

library(shiny)    
shinyUI(fluidPage(    
  titlePanel("Example"),    
  sidebarLayout(    
    sidebarPanel(    
      radioButtons("orderdata", "Sort by :",
                   c("Name" = "name",    
                     "MRDNo" = "mrdno"                        
                   ))
    ),   
    mainPanel(    
      uiOutput("deatilscv")    
    )
  )
))
Server.R    
library(shiny)    
library(shinyjs)
shinyServer(function(input, output) {    
  observeEvent(input$orderdata,
   {
     output$deatilscv <- renderUI({    
     if(input$orderdata=="name")    
     {
    mid<-c("1","2")    
    name<-c("a","b")
    datatable1 <- data.frame(mid,name)       
    fluidPage(shinyjs::useShinyjs(),    
              actionButton("button1", "CLICK")  )    
     }
    else if(input$orderdata=="mrdno")    
    {
      mid<-c("3","4")    
      name<-c("c","d")
      datatable2 <- data.frame(mid,name)    
      fluidPage(shinyjs::useShinyjs(),    
                actionButton("button1", "CLICK")  )
     }
     })    
  })
  observeEvent(        
    input$button1,{          
      a <- datatable1[1,2]  #this shows an error object 'datatable1' not found          
      print(a)
    })  
  observeEvent(
    input$button2,{
      a <- datatable2[1,2]  #this shows an error object 'datatable2' not found          
      print(a)
    })
})
如上面所示,程序中有两个错误。如何在观察事件中访问数据表?

不确定你想要完成什么。也许你可以解释一下你的应用程序应该如何工作。我改变你的代码,以显示数据集根据所选的单选按钮。您不需要将输出放在observeEvent中。

library(shiny)  
library(shinyjs)
ui <- shinyUI(fluidPage(
  titlePanel("Example"), 
  sidebarLayout( 
    sidebarPanel( 
      radioButtons("orderdata", "Sort by :", 
                   c("Name" = "name", 
                     "MRDNo" = "mrdno"    ))
        ), 
    mainPanel( 
      tableOutput("deatilscv") 
    )
  )
))

server <- shinyServer(function(input, output) {
 # observeEvent(input$orderdata,   {
      output$deatilscv <- renderTable({ 
         if(input$orderdata=="name")   {
            mid        <- c("1","2");   name <-c("a","b") 
            datatable <- data.frame(mid,name)  
          #  fluidPage(shinyjs::useShinyjs(), actionButton("button1", "CLICK")  ) 
         }  else if(input$orderdata=="mrdno")  {
            mid<-c("3","4");  name<-c("c","d") 
            datatable <- data.frame(mid,name) 
           # fluidPage(shinyjs::useShinyjs(),   actionButton("button1", "CLICK")  )
         }

     }) 
  # }) 
  # observeEvent(  input$button1,{
  # 
  #              a <- datatable1[1,2]  #this shows an error object 'datatable1' not found 
  #               print(a)
  #            })  
  # observeEvent(  input$button2,{ 
  #     a <- datatable2[1,2]  #this shows an error object 'datatable2' not found 
  #     print(a)
  #   })
})
shinyApp(ui, server)
  1. 我认为你需要从renderTable函数中分离出observeEvent函数。
  2. 然后,将observeEvent保存为一个类对象,稍后在renderTable(输出)函数中调用,如下所示:
my_table <- observeEvent({
datatable <- data.frame(input$orderdata)
### to call your table later on
print(datatable)
      })
#Put the render function outside the observe event
   output$deatilscv <- renderTable({    
  rendered_table <- mytable( )        
})
}

最新更新