根据用户输入过滤数据范围
Filter Data Range based on User Input
我有一个闪亮的应用程序,它在散点图中绘制两个变量并根据用户输入进行过滤。我正在尝试获取它,以便用户可以根据他们指定的范围过滤数据。但是,我只希望在字段已填写时应用此过滤器,如果字段为空(null),则 return 应用于所有数据。例如,如果您启动我附加的代码,我希望用户能够选中“指定数据范围”复选框,当他们在最小 x 输入框中输入 4.8 时,数据会被过滤掉,这样就没有数据点了现在考虑小于 4.8。我准备的示例代码在下面,我尝试在中间附近注释掉我正在尝试做的事情。
#Check packages to use in library
{
library('shiny') #allows for the shiny app to be used
library('ggvis') #allows for interactive ploting
}
alldata <- iris
#establish options for drop down menus
{
specieschoices <- unique(as.character(alldata$Species))
}
# UI
ui<-fluidPage(
titlePanel("Explorer"),
fluidRow(
column(4,
wellPanel(
h4("Apply Filters"),
selectInput(inputId = "species", label="Select a Species:", choices = sort(specieschoices), selected="setosa", multiple = TRUE, selectize = TRUE)
)),
column(8,
ggvisOutput("plot1")
),
column(4,
wellPanel(
h4("Data Variables"),
selectInput(inputId = "x", label="Select x-axis Variable:", choices=as.character(names(alldata[,1:4])),selected='Petal.Length', multiple = FALSE),
selectInput(inputId = "y", label="Select y-axis Variable:", choices=as.character(names(alldata[,1:4])),selected='Petal.Width', multiple = FALSE)
)),
column(4,
wellPanel(
checkboxInput(inputId = "datarange", label="Specify Data Ranges", value = FALSE),
conditionalPanel(
condition = "input.datarange == true",
wellPanel(
numericInput(inputId = "minxdata", label="Specify x axis min", value = -9999999999, step = 0.1),
numericInput(inputId = "maxxdata", label="Specify x axis max", value = 9999999999, step = 0.1),
numericInput(inputId = "minydata", label="Specify y axis min", value = -9999999999, step = 0.1),
numericInput(inputId = "maxydata", label="Specify y axis max", value = 9999999999, step = 0.1)
))
))
))
#SERVER
server<-function(input,output,session)
{
#Set up reactive variables for ranges
filteredData <- reactive({
minX <- input$minxdata
maxX <- input$maxxdata
minY <- input$minydata
maxY <- input$maxydata
# Apply filters
m <- alldata %>% filter(
`Species` %in% input$species
###############THIS IS THE PART THAT I NEED HELP WITH
#This works as hardcoded with hypothetical user input of x=Petal.Length and y=Petal.Width
,
Petal.Length >= minX,
Petal.Length <= maxX,
Petal.Width >= minY,
Petal.Width <= maxY
#This is does not work
# ,
# as.symbol(input$x) >= minX,
# as.symbol(input$x) <= maxX,
# as.symbol(input$y) >= minY,
# as.symbol(input$y) <= maxY
#####################################################
)
m <- droplevels(as.data.frame(m))
m
})
vis <- reactive({
#Plot Data with Visualization Customization
xvar <- prop("x", as.symbol(input$x))
yvar <- prop("y", as.symbol(input$y))
p1 = filteredData() %>%
ggvis(x = xvar, y = yvar) %>%
layer_points() %>%
# Specifies the size of the plot
set_options(width = 800, height = 450, duration = 0)
})
#Actually plots the data
vis %>% bind_shiny("plot1")
}
#Run the Shiny App to Display Webpage
shinyApp(ui=ui, server=server)
更新:
我认为我的做法是正确的,但是如果更改为 >= 0,最小 x 和最小 y 会过滤掉所有数据,而其他过滤器如果更改则不会执行任何操作。
paste0("`", input$x, "`") >= minX,
paste0("`", input$x, "`") <= maxX,
paste0("`", input$y, "`") >= minY,
paste0("`", input$y, "`") <= maxY
我发现了一个基于这个完全不相关的 post 的答案,该答案探讨了他们如何以对我有用的不同方式处理数据。
Downloading png from Shiny (R)
唯一的变化是在下面 post 编辑的 filteredData 中。
#Set up reactive variables for ranges
filteredData <- reactive({
minX <- input$minxdata
maxX <- input$maxxdata
minY <- input$minydata
maxY <- input$maxydata
a <- which(names(alldata)==input$x)
xvariable <- as.numeric(alldata[,a])
b <- which(names(alldata)==input$y)
yvariable <- as.numeric(alldata[,b])
# Apply filters
m <- alldata %>% filter(
`Species` %in% input$species,
xvariable >= minX,
xvariable <= maxX,
yvariable >= minY,
yvariable <= maxY
)
m <- droplevels(as.data.frame(m))
m
})
我有一个闪亮的应用程序,它在散点图中绘制两个变量并根据用户输入进行过滤。我正在尝试获取它,以便用户可以根据他们指定的范围过滤数据。但是,我只希望在字段已填写时应用此过滤器,如果字段为空(null),则 return 应用于所有数据。例如,如果您启动我附加的代码,我希望用户能够选中“指定数据范围”复选框,当他们在最小 x 输入框中输入 4.8 时,数据会被过滤掉,这样就没有数据点了现在考虑小于 4.8。我准备的示例代码在下面,我尝试在中间附近注释掉我正在尝试做的事情。
#Check packages to use in library
{
library('shiny') #allows for the shiny app to be used
library('ggvis') #allows for interactive ploting
}
alldata <- iris
#establish options for drop down menus
{
specieschoices <- unique(as.character(alldata$Species))
}
# UI
ui<-fluidPage(
titlePanel("Explorer"),
fluidRow(
column(4,
wellPanel(
h4("Apply Filters"),
selectInput(inputId = "species", label="Select a Species:", choices = sort(specieschoices), selected="setosa", multiple = TRUE, selectize = TRUE)
)),
column(8,
ggvisOutput("plot1")
),
column(4,
wellPanel(
h4("Data Variables"),
selectInput(inputId = "x", label="Select x-axis Variable:", choices=as.character(names(alldata[,1:4])),selected='Petal.Length', multiple = FALSE),
selectInput(inputId = "y", label="Select y-axis Variable:", choices=as.character(names(alldata[,1:4])),selected='Petal.Width', multiple = FALSE)
)),
column(4,
wellPanel(
checkboxInput(inputId = "datarange", label="Specify Data Ranges", value = FALSE),
conditionalPanel(
condition = "input.datarange == true",
wellPanel(
numericInput(inputId = "minxdata", label="Specify x axis min", value = -9999999999, step = 0.1),
numericInput(inputId = "maxxdata", label="Specify x axis max", value = 9999999999, step = 0.1),
numericInput(inputId = "minydata", label="Specify y axis min", value = -9999999999, step = 0.1),
numericInput(inputId = "maxydata", label="Specify y axis max", value = 9999999999, step = 0.1)
))
))
))
#SERVER
server<-function(input,output,session)
{
#Set up reactive variables for ranges
filteredData <- reactive({
minX <- input$minxdata
maxX <- input$maxxdata
minY <- input$minydata
maxY <- input$maxydata
# Apply filters
m <- alldata %>% filter(
`Species` %in% input$species
###############THIS IS THE PART THAT I NEED HELP WITH
#This works as hardcoded with hypothetical user input of x=Petal.Length and y=Petal.Width
,
Petal.Length >= minX,
Petal.Length <= maxX,
Petal.Width >= minY,
Petal.Width <= maxY
#This is does not work
# ,
# as.symbol(input$x) >= minX,
# as.symbol(input$x) <= maxX,
# as.symbol(input$y) >= minY,
# as.symbol(input$y) <= maxY
#####################################################
)
m <- droplevels(as.data.frame(m))
m
})
vis <- reactive({
#Plot Data with Visualization Customization
xvar <- prop("x", as.symbol(input$x))
yvar <- prop("y", as.symbol(input$y))
p1 = filteredData() %>%
ggvis(x = xvar, y = yvar) %>%
layer_points() %>%
# Specifies the size of the plot
set_options(width = 800, height = 450, duration = 0)
})
#Actually plots the data
vis %>% bind_shiny("plot1")
}
#Run the Shiny App to Display Webpage
shinyApp(ui=ui, server=server)
更新:
我认为我的做法是正确的,但是如果更改为 >= 0,最小 x 和最小 y 会过滤掉所有数据,而其他过滤器如果更改则不会执行任何操作。
paste0("`", input$x, "`") >= minX,
paste0("`", input$x, "`") <= maxX,
paste0("`", input$y, "`") >= minY,
paste0("`", input$y, "`") <= maxY
我发现了一个基于这个完全不相关的 post 的答案,该答案探讨了他们如何以对我有用的不同方式处理数据。 Downloading png from Shiny (R)
唯一的变化是在下面 post 编辑的 filteredData 中。
#Set up reactive variables for ranges
filteredData <- reactive({
minX <- input$minxdata
maxX <- input$maxxdata
minY <- input$minydata
maxY <- input$maxydata
a <- which(names(alldata)==input$x)
xvariable <- as.numeric(alldata[,a])
b <- which(names(alldata)==input$y)
yvariable <- as.numeric(alldata[,b])
# Apply filters
m <- alldata %>% filter(
`Species` %in% input$species,
xvariable >= minX,
xvariable <= maxX,
yvariable >= minY,
yvariable <= maxY
)
m <- droplevels(as.data.frame(m))
m
})