观察事件中闪亮的反应数据集

Posted

技术标签:

【中文标题】观察事件中闪亮的反应数据集【英文标题】:Shiny reactive dataset within observeEvent 【发布时间】:2018-05-26 03:54:21 【问题描述】:

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

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

最小重复示例 - 这失败因为 merge_data() 在 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
      )


   ) #observeevent

   output$DT1 <- renderDataTable(#

      rendered_table <- merged_data()

      DT::datatable(rendered_table)
   )   




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

最小重复示例 - 这有效,因为数据表是在 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 环境之外访问,以便我在应用程序的其他部分使用它,但我怀疑这是错误的方法。所以任何有效的东西都会很棒。

【问题讨论】:

尝试使用reactiveValue 而不是reactive 你可以这样做merged_data &lt;- eventReactive(input$fetch_data_inputId, ......,这样你就不需要observeEvent 谢谢你们两位的cmets。如果我对 reactiveValue 子反应,第一段代码会继续出错。使用 eventReactive 替换 observeEvent 也会继续出错。在这两种情况下,错误都是“警告:merged_data 中的错误:找不到函数“merged_data” 如果你定义了merged_data &lt;- eventReactive(input$fetch_data_inputId, ......,没有理由找不到这个函数。你在某个地方做错了。您是否删除了observeEvent 斯蒂芬,你是对的。我用 eventReactive 替换了 observeEvent,而您没有建议这样做。它现在起作用了——你应该把它记下来作为答案。 【参考方案1】:
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)

【讨论】:

以上是关于观察事件中闪亮的反应数据集的主要内容,如果未能解决你的问题,请参考以下文章

闪亮的:如何在闪亮的应用程序中添加反应栏

ggplot2无法识别闪亮的反应数据

闪亮的传单不适用于动态菜单

更新多个相关的 selectizeInput() 控制通过这些输入选择过滤的反应数据集

使用动态菜单时,闪亮的传单无法正常工作

使闪亮的模块反应