2016-07-07 14 views
4

Meine App hat ein paar Diagramme, und ich möchte sie in einem separaten Skript zeichnen, um eine sauberere server.R zu haben, die dann nur die bind_shiny Anrufe enthält.Wie man ein dynamisches ggvis Diagramm in glänzendem modularisiert?

Auch, weil ich einige der Bausteine ​​meiner Diagramme recyceln möchte, möchte ich das Skript teilen, um die Diagramme in kleineren Teilen des Codes zu zeichnen.

Rechte wissen, ich habe eine charts.R-Datei wie folgt:

chart1 <- reactive({ 
    cars %>% 
    ggvis(~speed) 

}) 

chart2 <- reactive({ 
    chart1 %>% layer_bars() 
}) 

Die Reaktivität ist natürlich nicht erforderlich, aber es wird in meiner ursprünglichen Anwendung.

Dann würde Ich mag die Grafik auf server.R auf diese Weise nennen:

library(shiny) 
library(ggvis) 
source("charts.R") 
shinyServer(function(input, output) { 

chart2 %>% 
    bind_shiny("test1", "test1_ui") 
}) 

ui.R

library(shiny) 
library(ggvis) 
shinyUI(fluidPage(

    fluidRow(titlePanel("My app")), 

    fluidRow(
      column(12, 
       tags$h1("hello"), 
       ggvisOutput('test1') 
       ) 
    ) 
    ) 
) 

Ich habe bemerkt, alles funktioniert in charts.R wenn ich alles in ein Objekt lege, aber nicht wenn ich die Funktion teile, die das Diagramm in mehrere Teile zieht. Allerdings, so etwas wie dies funktioniert

> a <- cars %>% 
+ ggvis(~speed) 
> a 
Guessing layer_histograms() 
Guessing width = 0.5 # range/42 
> a %>% layer_bars() 

Jeder konnte erklären, wie das Problem zu beheben und warum meine zwei Schritte Werke in R nähern, aber nicht in Shiny?

Antwort

0

Wenn Ihr Problem darin besteht, dass Sie das Diagramm nicht sehen können, müssen Sie in Ihrer zweiten Anweisung recative auf chart1 als chart1() verweisen. Mit anderen Worten, ändern Sie Ihre charts.R zu

Charts.R

chart1 <- reactive({ 
      cars %>% 
       ggvis(~speed) 
}) 

chart2 <- reactive({ 
      chart1() %>% layer_bars() 
}) 

Wenn Sie mehr über die Reaktivität erfahren möchten, wenden Sie sich bitte this Link überprüfen.