2016-07-25 18 views
0

Ich habe eine einfache App erstellt, die ein selectInput Widget und ein Balkendiagramm in rCharts enthält. Was ich erreichen möchte, ist, die Handlung mit einer Legende mit allen drei Büchern zu erstellen, aber standardmäßig nur ein Buch anzuzeigen, das vom Widget ausgewählt wird. Wenn ich also von Book1 zu Book2 wechsle, zeigt das Diagramm anfänglich nur Informationen über Book2, aber das Legendenplot enthält Book1 und Book3 (beide standardmäßig deaktiviert) - wenn ich möchte, kann ich jederzeit Book1 oder Book3 wählen. Ich glaube, es ist JS-Problem, also habe ich versucht, es zu lösen, aber nichts hat sich geändert. Irgendwelche Ideen, wie man damit umgeht? Vielen Dank.Legenden bearbeiten durch selectInput - multibarChart in rCharts

library(shiny) 
library(rCharts) 

books <- c('Book1','Book2','Book3') 
df <- data.frame(book = rep(books, each = 10), 
       year = rep(2000:2009,3), 
       sale = sample(100:1000, 30, replace = T)) 

ui <- shinyUI(
     fluidPage(
      HTML(" 
      <script> 
       $(document).ready(function() { 
         if ($(\"select#book div.selectize-dropdown div[data-value='Book1']\").hasClass('selected')) { 
           console.log('true'); 
           $('#nvd3Plot .nv-legend g.nv-series').eq(1).addClass('disabled'); 
           $('#nvd3Plot .nv-legend g.nv-series').eq(2).addClass('disabled'); 
         } 
         else { 
           console.log('false'); 

         } 
       }); 
      </script>"), 

      selectInput('book', 'Select a book', choices = books, selected = 'Book1'), 
      showOutput("nvd3Plot", "nvd3") 
    ) 
) 

server <- function(input, output, session) { 
     output$nvd3Plot <- renderChart2({ 

      chartObject <- nPlot(sale ~ year, group = "book", data = df, type = "multiBarChart") 
      chartObject$chart(
        showControls = FALSE 
       ) 

      return(chartObject) 
     }) 
} 

shinyApp(ui, server) 

aktualisieren

ich diese solution gefunden, aber ich habe wirklich keine Ahnung, wie es

+0

Ich habe noch nicht gefunden, wie es gemacht werden könnte, aber wenn Sie hier [nvd3] suchen (ich habe noch nicht gefunden), könnten Sie _Multibar Chart mit Controls_ in dem Beispiel sehen, in dem sie controle verwenden, um den Datensatz auf dem zu filtern Sex (männlich, weiblich). Vielleicht ist ihr etwas auf diese Art zu tun. –

+0

Könnten Sie mir bitte diesen Link schicken? – Nicolabo

+0

Mein Fehler falsch einfügen. http://ramnathv.github.io/posts/rcharts-nvd3/ –

Antwort

1

Mit der Antwort von here in R. zu implementieren, können Sie eine benutzerdefinierte Nachricht verwenden Handler, um programmatisch auf die Legende zu klicken.

Sie könnten hinzufügen, in Ihrem ui.R:

tags$script(' 
     Shiny.addCustomMessageHandler("change_selected_book", 
     function(book) { 
      d3.select("g.nv-legendWrap").selectAll("g.nv-series.disabled") 
      .each(function(d) { 
      this.dispatchEvent(new Event("click")); 
     }); 

      d3.select("g.nv-legendWrap").selectAll("g.nv-series").filter(
      function(d) { return d.key != book; }) 
     .each(function(d) { 
      this.dispatchEvent(new Event("click")); 
     }); 
     }); 
    ') 

und in Ihrem server.R:

observe({ 
    session$sendCustomMessage(type = "change_selected_book", input$book) 
    }) 

Der Code auf alle Behinderte Serie klickt, und sobald alle Serie aktiviert sind, es klickt auf der Legende aller Bücher außer dem, den der Benutzer ausgewählt hat, um sie zu deaktivieren.

Ein Nachteil ist, dass das Element selectInput vor dem Diagramm erstellt wird, so dass es zunächst alle drei Bücher anzeigt, bis der Benutzer eines auswählt.

+0

Großartig, vielen Dank! In Bezug auf selectInput Nachteil, wissen Sie eine Option, um es zu vermeiden? – Nicolabo