2016-04-22 6 views
2

Ich versuche, Shiny zu verwenden, um Variablen auszuwählen, die ich in einem mehrzeiligen Diagramm darstellen möchte, das mit Plotly gerendert wird. Ich habe viele Variablen, daher möchte ich Shiny anstelle von Plotlys interaktivem Legenden- "Klick" -Auswahlmechanismus auswählen. Beispieldaten:R Shiny, um Spuren für Plotly Liniendiagramm auszuwählen?

library(plotly)      
# Example dataframe 
foo <-data.frame(mon = c("Jan", "Feb", "Mar"), 
        var_1 = c(100, 200, 300), 
        var_b = c(80, 250, 280), 
        var_three = c(150, 120,201) 
       ) 

Wenn Plotly direkt verwendet, kann ich manuell Spuren hinzufügen Code wie folgt verwendet:

p <- plot_ly(x = foo$mon, y = foo$var_1, line = list(shape="linear")) 
p <- add_trace(p, x = foo$mon, y = foo$var_b) 
p <- add_trace(p, x = foo$mon, y = foo$var_three) 
print(p) 

Jetzt möchte ich eine glänzende Kontrollkästchen verwenden, um die Variablen auszuwählen Ich möchte auf das sehen Handlung. Die Auswahl wird in der Eingabe $ show_vars erfasst, aber wie kann ich diese wechselnde Liste von Variablen durchlaufen und plotten? Hier ist mein app.R-Code, der eine der Variablen manuell plottet. Vorschläge geschätzt!

#------------------------------------------------------------------------------ 
# UI 
#------------------------------------------------------------------------------ 
ui <- fluidPage(
    sidebarLayout(
     sidebarPanel(
      checkboxGroupInput('show_vars', 'Columns in the dataset', names(foo), 
           selected = c('mon', 'var_1')), 
      helpText('Select the variables to show in the graph.') 
     ), 
     mainPanel(
      plotlyOutput("myPlot") 
     ) 
    ) 
) 
#------------------------------------------------------------------------------ 
# SERVER 
# Need to loop through input$show_vars to show a trace for each one? 
#------------------------------------------------------------------------------ 
server <- function(input, output) { 
    # a large table, reative to input$show_vars 
    output$uteTable = renderDataTable({ 
     library(ggplot2) 
     ute[, input$show_vars, drop = FALSE] 
    }) 

    output$myPlot = renderPlotly({ 
     plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear")) 
     ## How to add the other traces selected in input$show_vars?? 
    }) 
} 
shinyApp(ui = ui, server = server) 

UPDATE: Ich weiß jetzt, dass ich das Skript benötigen Hartcodierung der ersten Parzelle zu vermeiden foo $ var_1 zu verwenden. Das Diagramm sollte eine der möglichen Auswahlmöglichkeiten in den Kontrollkästchen verwenden (minus $ mon, die ich aus der Auswahlliste entfernt habe). Wenn ich versuche, die erste Plot-Anweisung zu konditionieren, erhalte ich die Fehlermeldung "Fehler: Der letzte Plot existiert nicht." dh das nicht funktioniert:

output$myPlot = renderPlotly({ 
    # p <- plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear")) 
    for (item in input$show_vars) { 
     if (item == 1){ 
      p <- plot_ly(x=foo$mon, y=foo[[item]], line = list(shape="linear")) 
     } 
     if(item > 1){ 
      p <- add_trace(p, x = foo$mon, y = foo[[item]], evaluate = TRUE) 
     } 
    } 
    print(p) 

Antwort

2

Prüfen Sie, ob das ist, was Sie wollen. Wahrscheinlich möchten Sie auch die ersten beiden Elemente in der checkboxGroup entfernen, damit sie nicht entfernt werden können (je nachdem, was Sie wollen).

output$myPlot = renderPlotly({ 
    p <- plot_ly(x=foo$mon, y=foo$var_1, line = list(shape="linear")) 
    ## How to add the other traces selected in input$show_vars?? 
    for (item in input$show_vars) { 
     p <- add_trace(p, x = foo$mon, y = foo[[item]], evaluate = TRUE) 
    } 
    print(p) 
}) 
+0

Ihre Antwort ist perfekt basierend auf meiner ursprünglichen Frage. Mir ist jetzt klar, dass ich das Skript brauche, um zu vermeiden, dass der erste Plot hart programmiert wird, um foo $ var_1 zu verwenden. Das Diagramm sollte eine der möglichen Auswahlmöglichkeiten in den Kontrollkästchen verwenden (minus $ mon, die ich aus der Auswahlliste entfernt habe). Wenn ich versuche, die erste Plot-Anweisung zu konditionieren, erhalte ich die Fehlermeldung "Fehler: Der letzte Plot existiert nicht." Dh das funktioniert nicht: for (Element in Eingabe $ show_vars) { if (item == 1) { p <- plot_ly (x = foo $ mon, y = foo [[Element]], Zeile = Liste (shape = "linear")) } – Tim

+0

Dies ist schwieriger als es scheint, da Sie eine y-Achse haben müssen, damit das Diagramm richtig funktioniert. Wenn Sie es Personen erlauben, alles zu deaktivieren, haben Sie möglicherweise ein Diagramm ohne "y" -Achse, und Sie erhalten seltsame Ergebnisse. Und es gibt keinen direkten Weg, um sicherzustellen, dass mindestens eine Box in Shiny markiert ist. –