2016-07-15 16 views
0

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 
+0

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 . –

+0

@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

+0

Es gibt ein weiteres Beispiel am Ende des Links, das den numerischen Eingang verwendet –

Antwort

0

Ich habe eine Antwort auf der Grundlage dieser völlig unabhängig Post entdeckt, die genähert, wie sie Daten in einer anderen Art und Weise verarbeitet, die für mich gearbeitet. Downloading png from Shiny (R)

Die einzige Änderung ist in filteredData, die unten veröffentlicht wird.

#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 
})