【问题标题】:How to access dataframe from another observeEvent?如何从另一个观察事件访问数据帧?
【发布时间】:2016-12-26 07:44:17
【问题描述】:

一个例子:

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 函数中定义的...所以它在按钮函数中是未知的。全局或直接在 shinyServer 内部定义数据。
  • 先生,但我希望只有在单击单选按钮时才为 datatable1 和 datatable2 分配一个数据框,这就是为什么我将数据放在 observeEvent 中。
  • 尝试熟悉反应式表达式,如shiny.rstudio.com/tutorial/lesson6 这是您的数据如何根据单选按钮选择更新以及您如何在其他功能中使用数据
  • 我使用了 reactiveEvent 而不是 observeEvent 但它不起作用,先生。

标签: r shiny


【解决方案1】:

不确定您要完成什么。也许您可以解释您的应用程序应该如何工作。我更改您的代码以根据所选单选按钮显示数据集。您不需要将输出放在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)

【讨论】:

    【解决方案2】:
    1. 我认为您需要将 observeEvent 函数与 renderTable 函数分开。
    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( )        
    
    })
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多