如何使用 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]]
希望对您有所帮助!
我无法过滤反应式数据集。我需要根据用户输入在我的电脑上调用不同的数据集;因为这些数据集具有相同的行名,所以我想为它们定义一个过滤器。
对于这个问题,我制作了两个简单的数据集。非常感谢你提前。
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]]
希望对您有所帮助!