Ich habe eine glänzende App, die zwei Variablen in einem Streudiagramm darstellt und Filter basierend auf Benutzereingaben erstellt. Ich versuche, es zu erhalten, damit der Benutzer die Daten basierend auf einem Bereich filtern kann, den sie angeben. Ich möchte jedoch nur, dass dieser Filter angewendet wird, wenn das Feld ausgefüllt ist, und zu allen Daten zurückkehren, wenn das Feld leer ist (null). Wenn Sie beispielsweise den Code starten, den ich angehängt habe, möchte ich, dass der Benutzer das Ankreuzfeld Datenbereiche festlegen aktivieren kann und wenn er 4,8 in das Eingabefeld min x eingibt, werden die Daten herausgefiltert, so dass keine Datenpunkte angezeigt werden weniger als 4,8 werden jetzt berücksichtigt. Der Beispielcode, den ich vorbereitet habe, ist unten mit meinem Versuch, was ich versuche, in der Mitte auskommentiert.Filterdatenbereich basierend auf Benutzereingabe
#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)
UPDATE:
Ich glaube, ich auf dem richtigen Weg bin mit diesem, aber die min x und y min alle Daten herausfiltert, wenn auf etwas geändert> = 0, und die anderen Filter nicht Tue alles, wenn du dich änderst.
paste0("`", input$x, "`") >= minX,
paste0("`", input$x, "`") <= maxX,
paste0("`", input$y, "`") >= minY,
paste0("`", input$y, "`") <= maxY
Siehe http://stackoverflow.com/questions/38108515/r-shiny-display-full-dataframe-without-filter-input-until-filterinputs-are-chang/38125743#38125743 für zwei ähnliche Beispiele . –
@warmoverflow Ich sehe die Ähnlichkeiten zwischen unseren beiden Problemen, aber es ist unklar, wie die Lösung in diesem Beitrag in meine Lösung implementiert werden soll. Ich benutze renderPlot nicht, wie dieser Benutzer rendernTable verwendet, so sehe ich nicht, wie ich über die Option gehen würde, Auswahlen hinzuzufügen, und ich habe numerische Eingabe, die ich durch kein Zeichen zu filtern versuche, so scheint nchar nicht anwendbar entweder. – User247365
Es gibt ein weiteres Beispiel am Ende des Links, das den numerischen Eingang verwendet –