2016-07-10 14 views
0

Ich habe bereits eine Antwort auf ziemlich genau das gleiche Thema hier Dynamic ggvis object in Shiny, aber ich bin immer noch mit einem ähnlichen Stück Code gestapelt und ich verstehe nicht wirklich warum.Wie man ein ggvis Diagramm von einer externen Quelle in glänzend einbettet?

ui.R

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

    fluidRow(titlePanel("My app")), 

    fluidRow(
      column(3, 
       tags$h1('Menu'), 
       radioButtons('colors', label = 'select bars color', 
            c("Red"='red','Green'='green','Blue'='blue')) 
       ), 
      column(9, 
       tags$h1("hello"), 
       ggvisOutput('test1'), 
       tags$h2("Chosen color is",textOutput('testText', inline = T)) 
       ) 
    ) 
    ) 
) 

server.R

library(shiny) 
library(ggvis) 
shinyServer(function(input, output) { 
source("charts.R") 
    output$testText <- reactive({ input$colors }) 
    input_color <- reactive({ input$colors }) 
    # cars %>% 
    # ggvis(~speed, fill:= input_color) %>% 
    # layer_bars() %>% 
    # bind_shiny("test1", "test1_ui") 
    chart1() %>% 
    bind_shiny("test1", "test1_ui") 
}) 

charts.R

chart1 <- reactive({ 
    cars %>% 
    ggvis(~speed, fill:= input_color) %>% 
    layer_bars() 
}) 

Ich mag würdeanrufenvon charts.R in server.R. Alles funktioniert mit ggvis, wenn ich den kommentierten Code in server.R verwende, aber es nicht, wenn ich versuche, die ggvis-Funktion von charts.R (wie im unkommentierten Code) aufzurufen.

Denken Sie auch, dass es eine gute Übung ist, mehrere .R-Skripte zu erstellen, oder soll ich nach geeigneten Modulen suchen?

Antwort

1

Sie benötigen 2 Dinge in Ihrem Skript bearbeiten:

  1. Wenn Sie den Server oder ui Code in mehrere Dateien aufteilen möchten, können Sie source(local=TRUE) verwenden, um jede Datei zu laden. Sie können sich das so vorstellen, als würde man den Code in eine Zeile schreiben, so dass der Code aus den Quelldateien den gleichen Umfang erhält, als wenn Sie den Text direkt dort kopiert und eingefügt hätten. (Schamlos von here kopiert)

  2. Reactive Objekte sollten nur in anderen reaktiven Ausdrücke oder machen * Ausdrücke

Also mit Klammern genannt werden, Ihre server.R zu sollte wie folgt aussehen:

library(shiny) 
library(ggvis) 

shinyServer(function(input, output) { 

source("charts.R", local = T) 

output$testText <- reactive({ input$colors }) 
input_color <- reactive({ input$colors }) 

chart1 %>% 
bind_shiny("test1", "test1_ui") 

})