2016-04-12 11 views
1

Ich versuche validate() in Shiny zu verwenden, aber jedes Mal, wenn der Validierungsbefehl einen Fehler findet, stoße ich auf ein Problem. Ich versuche etwas darzustellen, wo gelegentlich eine Unterkategorie von Daten keine Werte hat (d. H. Wenn die Kategorien Farben sind, können Sie "grün" auswählen, aber manchmal enthält das Dataset keine Zeilen in der Kategorie "grün").R Shiny mit validate: Plot wird nur nach Größenänderung aktualisiert

Immer wenn die Bedingung, die ich überprüfe, als falsch zurückkommt, wird die Fehlermeldung korrekt ausgegeben. Wenn ich dann einen neuen Wert erneut anwähle und aktualisiere, erscheint der neue Plot nur, nachdem ich die Größe des Fensters manuell geändert habe, anstatt wie gewohnt nach dem Klicken auf "update" zu erscheinen.

colors = c("green","blue","red") 
library(shiny) 

ui <- fluidPage(

    tabsetPanel(
    tabPanel("Info", 
      selectInput(inputId = "color",label = "color:", 
         choices = colors, 
         selected = colors[2], 
         multiple = FALSE), 
      actionButton(inputId = "go", 
          label = "Update"), 
      plotOutput("plot", width = "100%", height = 700, 
         brush = brushOpts(id = "plot_brush",fill = "green",clip = FALSE)) 

    ) 
) 
) 

server <- function(input, output,session) { 

    data = eventReactive(input$go, { 
    var1 = rnorm(20,5) 
    cat1 = (c(rep("red",10),rep("blue",10))) 
    data = cbind.data.frame(var1,cat1) 
    plotdata = data[which(data$cat1 ==isolate(input$color)),] 

    } 
) 

    output$plot = renderPlot({ 

    validate(
     need( (isolate(input$color) %in% c("red","blue")) , "No color of this type ") 
    ) 

    plotdata = data() 
    plot(plotdata$var1, col = isolate(input$color)) 
    }) 
} 

shinyApp(ui = ui,server = server) 

FYI bin ich mit Shiny Version 0.13.1, R Version 3.2.3

Antwort

1

Das Problem ist, dass input$color in isolate in Ihrer need Anweisung gewickelt wird. So denkt die need immer noch, dass Sie die falsche Farbe gewählt haben, denn nichts sagt input$color erneut zu überprüfen. Wenn Sie input$go als die erste Zeile Ihres renderPlot (kurz vor dem validate) hinzufügen, denke ich, dass es tut, was Sie wollen.

+0

Das repariert es, aber ich mag die isolate-Anweisung, so dass die Farben nicht ändern, bis Sie die Schaltfläche "Update" drücken. Irgendeine Idee, warum die Größenänderung des Fensters die Änderung in diesem Fall auslöst, im Gegensatz zu nur der Aktualisierungsschaltfläche? – Peter

+0

Sie können das "Isolat" beibehalten, indem Sie einfach die Eingabe von der Schaltfläche hinzufügen, damit das Diagramm ausgelöst wird. Meine Vermutung ist, dass, wenn Sie die Größe ändern, glänzend das Plot rekonstruieren muss, so dass es den 'renderPlot' ausführt, und dann wird das' validate' neu bewertet. –

+0

Brilliant! Danke, ich wusste nicht, dass du den Action Button in den Renderplot einfügen kannst. – Peter