如何使用 dplyr 从反应数据集中过滤?

How can I filter from a reactive dataset using dplyr?

我无法过滤反应式数据集。我需要根据用户输入在我的电脑上调用不同的数据集;因为这些数据集具有相同的行名,所以我想为它们定义一个过滤器。
对于这个问题,我制作了两个简单的数据集。非常感谢你提前。

UI

library(shiny)

ui <- fluidPage(
sidebarLayout(sidebarPanel(selectInput('number', h4("Select number"), 
choices = c("first", "second")),
    selectInput('dataset', h4("Select dataset"),
    choices=c("dataset1",
    "dataset2"))),

    mainPanel(
    plotOutput("graph")
    )))

服务器

server <- function(input, output) {

library(ggplot2)
library(dplyr)


dataset1 <- data.frame(names=c("first", "second"), 
X1=rnorm(1:10),X2=rnorm(1:10),X3=rnorm(1:10))
dataset2 <- data.frame(names=c("first", "second"), 
X1=rnorm(1:10),X2=rnorm(1:10),X3=rnorm(1:10))

plotdata <- reactive ({get(input$dataset)

if(input$number == "first") {
  filter(plotdata, names=="first")}
else if(input$number == "second") {
  filter(plotdata, names=="second")} 
})

 output$graph <- renderPlot({

datos <- plotdata()

ggplot(datos, aes(X1, X2)) + 
  geom_col()

 })

 }

 shinyApp(ui = ui, server = server)

我得到以下 错误:'filter_' 没有适用的方法应用于 class "c('reactiveExpr', 'reactive')" 的对象

然而,当反应数据部分被以下代码替换时,它使图表没有问题,但我必须定义变量和数据集之间的所有可能组合(这不是一个选项,因为真实数据集是 5在 UI):

上有很多变量和行可供选择
plotdata <- reactive ({

if(input$number == "first") {
  filter(dataset1, names=="first")}
else if(input$number == "second") {
  filter(dataset1, names=="second")} 
})

那么如何使用 dplyr 从反应数据集中过滤?

您需要将反应数据作为函数调用plotdata()

你可以这样做:

library(shiny)

ui <- fluidPage(
  sidebarLayout(sidebarPanel(selectInput('number', h4("Select number"), 
                                         choices = c("first", "second")),
                             selectInput('dataset', h4("Select dataset"),
                                         choices=c("dataset1",
                                                   "dataset2"))),
                mainPanel(
                  plotOutput("graph")
                ))
)

server <- function(input, output) {

  library(ggplot2)
  library(dplyr)

  dataset1 <- data.frame(names=c("first", "second"), 
                         X1=rnorm(1:10),X2=rnorm(1:10),X3=rnorm(1:10))
  dataset2 <- data.frame(names=c("first", "second"), 
                         X1=rnorm(1:10),X2=rnorm(1:10),X3=rnorm(1:10))

  plotdata <- reactive ({
    dataset <- get(input$dataset)
    dataset %>% filter(names==input$number)
  })

  output$graph <- renderPlot({
    datos <- plotdata()
    ggplot(datos, aes(X1, X2)) + 
      geom_col()
  })

}

shinyApp(ui = ui, server = server)

但是,我的建议是不要使用 get,而是将您的数据集存储在命名列表中,例如 datasets <- list('dataset1'=1, 'dataset2'=2) 然后调用 datasets[[input$dataset]]

希望对您有所帮助!