observeEvent

时间:2017-12-12 12:46:45

标签: r events shiny shiny-reactivity

我有一个非常简单的应用程序失败了。失败的原因是反应数据集仅在observeEvent函数内可用,但不在外部。我使用observeEvent来获取来自两个不同来源的数据集。对于这个例子,我只使用了cbind。我的实际代码要复杂得多。

这是一个逻辑/语法相关的问题,但我所有的搜索都很简短。本质上,我希望merged_data()可用于应用程序的所有部分。

最小repr示例 - 此失败,因为在ObserveEvent之外无法使用merged_data()。

library(shiny)
library(shinyjs)
library(DT)

# Define UI for application that draws a histogram
ui <- fluidPage(

   # Application title
   titlePanel("testing 1 2 3"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
      ),


      # Show a plot of the generated distribution
      mainPanel(
         fluidRow(
            column(width = 2,
                   offset = 0,
                   align = "center",
                   actionButton(inputId = "fetch_data_inputId",
                                label = "data")

            ) #column
            ,
            column(width = 10,
                   offset = 0,
                   align = "center",
                   DT::dataTableOutput("DT1")
            ) #column

         )#fluidrow
      )
   )
)

# Define server logic required to draw a histogram
server <- function(input, output,session) {

   observeEvent(input$fetch_data_inputId, {

      req(iris) 

      button_data <- colnames(iris)

      merged_data <- reactive({

         if( !is.null(cbind(iris[,1:4],iris3))) {
            cbind(iris[,1:4],iris3)
         } else {NULL}
      })


   }) #observeevent

   output$DT1 <- renderDataTable({#

      rendered_table <- merged_data()

      DT::datatable(rendered_table)
   })   


}

# Run the application 
shinyApp(ui = ui, server = server)

最小repr示例 - 此工作,因为数据表是在ObserveEvent中创建的。

library(shiny)
library(shinyjs)
library(DT)

# Define UI for application that draws a histogram
ui <- fluidPage(

   # Application title
   titlePanel("testing 1 2 3"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
      ),


      # Show a plot of the generated distribution
      mainPanel(
         fluidRow(
            column(width = 2,
                   offset = 0,
                   align = "center",
                   actionButton(inputId = "fetch_data_inputId",
                                label = "data")

            ) #column
            ,
            column(width = 10,
                   offset = 0,
                   align = "center",
                   DT::dataTableOutput("DT1")
            ) #column

         )#fluidrow
      )
   )
)

# Define server logic required to draw a histogram
server <- function(input, output,session) {

   observeEvent(input$fetch_data_inputId, {

      req(iris) 

      button_data <- colnames(iris)

      merged_data <- reactive({

         if( !is.null(cbind(iris[,1:4],iris3))) {
            cbind(iris[,1:4],iris3)
         } else {NULL}
      })


      output$DT1 <- renderDataTable({#

         rendered_table <- merged_data()

         DT::datatable(rendered_table)
      })   

   }) #observeevent



}

# Run the application 
shinyApp(ui = ui, server = server)

我真正需要的是反应数据集继续在observeEvent中创建,但是可以在ObserveEvent环境之外访问,以便我在应用程序的其他部分使用它,但我怀疑这是错误的方法。所以任何有效的东西都会很棒。

1 个答案:

答案 0 :(得分:2)

library(shiny)
library(shinyjs)
library(DT)

# Define UI for application that draws a histogram
ui <- fluidPage(

   # Application title
   titlePanel("testing 1 2 3"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
      ),


      # Show a plot of the generated distribution
      mainPanel(
         fluidRow(
            column(width = 2,
                   offset = 0,
                   align = "center",
                   actionButton(inputId = "fetch_data_inputId",
                                label = "data")

            ) #column
            ,
            column(width = 10,
                   offset = 0,
                   align = "center",
                   DT::dataTableOutput("DT1")
            ) #column

         )#fluidrow
      )
   )
)

# Define server logic required to draw a histogram
server <- function(input, output,session) {

   merged_data <- eventReactive(input$fetch_data_inputId, {
      req(iris) 

      button_data <- colnames(iris)

      if( !is.null(cbind(iris[,1:4],iris3))) {
         cbind(iris[,1:4],iris3)
      } else {NULL}

   }) #eventReactive

   output$DT1 <- renderDataTable({#
      rendered_table <- merged_data()
      DT::datatable(rendered_table)
   })   
}

# Run the application 
shinyApp(ui = ui, server = server)