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

时间:2018-01-12 15:32:29

标签: r shiny dplyr reactive

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

用户界面

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

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)

我得到以下 错误:没有适用的方法来过滤_&#39;适用于班级&#34; c(&#39; reactiveExpr&#39;,&#39;被动&#39;)&#34;

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

plotdata <- reactive ({

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

那么如何使用dplyr ??

从反应数据集中过滤

2 个答案:

答案 0 :(得分:0)

您需要将反应数据称为函数plotdata()

答案 1 :(得分:0)

你可以这样做:

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]]调用

希望这有帮助!