首页 > 解决方案 > Shiny App 过滤一次 df 用于多个绘图

问题描述

我有一个闪亮的应用程序,它根据选定的过滤器生成多个图,对于服务器部分中的每个图,我根据选定的输入过滤器过滤数据:

output$plot_1 <- renderPlot({     
     df <- df %>% filter(df$filter == input$age)
     #plot code here
  })

output$plot_2 <- renderPlot({     
     df <- df %>% filter(df$filter == input$age)
     #plot code here
  })

我必须为所有图执行此操作(在 renderPLot 函数中过滤 df)。是否可以在 renderPlot 之外进行,以便过滤后的 df 可用于所有绘图?

标签: rshiny

解决方案


当然,我们可以将过滤后的数据存储在响应式中,因此我们可以在多个地方使用它。使用反应式时请注意双括号,即df_filtered()

这是一个最小的工作示例,显示数据存储在反应式中并在两个图中使用。


library(shiny)
library(dplyr)

ui <- fluidPage(
  
    selectInput("mydropdown", "Select Species", choices = unique(iris$Species)),
    
    plotOutput("plot_1"),
    
    plotOutput("plot_2")
    
)

server <- function(input, output, session) {
    
    #Reactive
    df_filtered <- reactive({
        
        df <- filter(iris, Species == input$mydropdown)
        
        return(df)
        
    })
    
    #Plot 1
    output$plot_1 <- renderPlot({
        
        plot(df_filtered()$Petal.Length)
        
    })
    
    #Plot 2
    output$plot_2 <- renderPlot({
        
        plot(df_filtered()$Petal.Width)
        
    })
    
}

shinyApp(ui, server)

推荐阅读