2017-05-16 1 views
1

Ich stelle ein einfaches Reporting-System zusammen, aber ich stürze mich in die erste Hürde und versuche, dies in Shiny anstatt meiner üblichen Route von Python/PHP.R & Shiny - Aktualisierung der dynamischen Anzahl der reaktiven Plots einmal dynamisch generiert

Hier ist, was ich bisher habe:

library(shiny) 
library(ggplot2) 
library(googleAnalyticsR) 

server <- function(input, output) { 

    id <- 'XXXXXXX' 

    #dynamically create the right number of output 
    output$plots <- renderUI({ 

    web_data <- google_analytics_4(id, 
            date_range = c(format(input$dates[1]), format(input$dates[2])), 
            metrics = c("sessions","pageviews","bounces"), 
            dimensions = c("date", "channelGrouping"), 
            anti_sample = TRUE) 

    plot_output_list <- lapply(unique(web_data$channelGrouping), function(i) { 
     plotname <- paste0("plot", i) 
     plotOutput(plotname) 
    }) 

    tagList(plot_output_list) 



    }) 

    for (channel in unique(web_data$channelGrouping)) { 
    local({ 
     plotname <- paste0("plot", channel) 
     localChannel <- channel 
     filtered_data <- subset(web_data, channelGrouping == channel, select=-channelGrouping) 
     filtered_data.long <- melt(filtered_data, id.vars='date') 

     output[[plotname]] <- renderPlot({ 
     ggplot(filtered_data.long, aes(date, value, color=variable))+ggtitle(localChannel)+geom_line() 
     }) 
    }) 
    } 
} 

ui <- fluidPage(

    titlePanel("XXXXXX Reporting"), 

    sidebarLayout(
    sidebarPanel(
     uiOutput("choose_view"), 
     dateRangeInput("dates", "dates") 
    ), 
    mainPanel(
     uiOutput("plots") 
    ) 
) 
) 

shinyApp(ui = ui, server=server) 

Die Frage, wie ich glaube, in der Platzierung der für Schleife. Wenn ich es dort platziere, wo es oben ist, scheint es keinen Zugriff auf web_data zu haben. Wenn ich es in den Block output$plots platziere, dann scheint es, dass tagList nicht auf der Benutzeroberfläche ausgegeben wird. Ich bin sicher, ich vermisse etwas am Zielfernrohr oder ähnlichem, aber ich habe es jetzt zu lange angeguckt!

EDIT nach Shayne03 Antwort:

ich folgendes jetzt haben, die näher an Arbeits scheint:

output$plots <- renderUI({ 
    plot_output_list <- lapply(unique(web_data()$channelGrouping), function(i) { 
     plotname <- paste0("plot", i) 
     plotOutput(plotname) 
    }) 

    }) 

    reactive({ 

    for (channel in unique(web_data()$channelGrouping)) { 

     local({ 
     plotname <- paste0("plot", channel) 
     localChannel <- channel 
     filtered_data <- subset(web_data(), channelGrouping == channel, 
           select=-channelGrouping) 
     filtered_data.long <- melt(filtered_data, id.vars='date') 

     output[[plotname]] <- renderPlot({ 
      ggplot(filtered_data.long, aes(date, value, 
             color=variable))+ggtitle(localChannel)+geom_line() 
     }) 
     }) 
    } 
    }) 


    web_data<-reactive({ 
    #get the GA data, between the dates specified by user 
    google_analytics_4(id, 
         date_range = c(format(input$dates[1]), 
             format(input$dates[2])), 
         metrics = c("sessions","pageviews","bounces"), 
         dimensions = c("date", "channelGrouping"), 
         anti_sample = TRUE) 
    }) 

Wenn ich den Code genau so haben, die Grundstücksflächen sind ausgegeben der HTML-Code, aber keine Grafiken. Ich habe versucht, aufgrund meines mangelnden Verständnisses den reaktiven Block in den renderUI-Block zu setzen, bekam aber einen Zwangsfehler. Ich bin mir sicher, dass es jetzt ein Tippfehler oder etwas ist, irgendwelche Ideen?

Antwort

0

Haben es am Ende nach einigen Experimenten nach Shayne03's Antwort. Zusätzlich zu seiner Antwort musste ich den reaktiven Block anrufen, der die Daten am Anfang des output$plots Blocks neu zeichnete.

Hier ist der Code, der meine erwartete Ausgabe in diesem Stadium gibt mir am Ende:

library(shiny) 
library(reshape2) 
library(ggplot2) 
library(googleAnalyticsR) 

server <- function(input, output) { 

    id <- 'XXXXXXX' 

    output$plots <- renderUI({ 

    updatePlots() 

    plot_output_list <- lapply(unique(web_data()$channelGrouping), function(i) { 
     plotname <- paste0("plot", i) 
     plotOutput(plotname) 
    }) 

    # 
    }) 

    updatePlots <- reactive({ 
    for (channel in unique(web_data()$channelGrouping)) { 

     local({ 
     plotname <- paste0("plot", channel) 
     localChannel <- channel 
     filtered_data <- subset(web_data(), channelGrouping == channel, 
           select=-channelGrouping) 
     filtered_data.long <- melt(filtered_data, id.vars='date') 

     print("Hi") 
     output[[plotname]] <- renderPlot({ 
      ggplot(filtered_data.long, aes(date, value, 
             color=variable))+ggtitle(localChannel)+geom_line() 
     }) 
     }) 
    } 
    }) 


    web_data<-reactive({ 
    #get the GA data, between the dates specified by user 
    google_analytics_4(id, 
         date_range = c(format(input$dates[1]), 
             format(input$dates[2])), 
         metrics = c("sessions","pageviews","bounces"), 
         dimensions = c("date", "channelGrouping"), 
         anti_sample = TRUE) 
    }) 

} 

ui <- fluidPage(

    titlePanel("XXXXX Reporting"), 

    sidebarLayout(
    sidebarPanel(
     uiOutput("choose_view"), 
     dateRangeInput("dates", "dates") 
    ), 
    mainPanel(
     uiOutput("plots") 
    ) 
) 
) 

shinyApp(ui = ui, server=server) 
0

Sie könnten web_data von renderUI entfernen und in einen reaktiven Block einfügen.

web_data<-reactive({ 
     google_analytics_4(id, 
          date_range = c(format(input$dates[1]), 
          format(input$dates[2])), 
          metrics = c("sessions","pageviews","bounces"), 
          dimensions = c("date", "channelGrouping"), 
          anti_sample = TRUE) 
}) 

Dadurch wird es sowohl für den renderUI-Aufruf als auch für die for-Schleife verfügbar. Sie müssen es nur als ein reaktives Objekt wie unten bezeichnen.

+0

Danke, das hat mir die Nähe, aber nicht ganz da. Ich habe bearbeitet, jede Chance, du könntest noch einen Blick darauf werfen? –

Verwandte Themen