ggvis与Shiny整合

时间:2015-02-10 02:54:53

标签: r shiny ggvis

这是一个简单的问题。我读了其他帖子,发现为了将GGVIS可视化插入Shiny,你需要:

  1. ui.R - 致电ggvisOutput("EvolucionVisitas")
  2. server.R - 使用函数bind_shiny("EvolucionVisitas")
  3. 我在绘制“EvoluciónVisitas”标签的图表时遇到了问题。 我做了两件事,但我在某个地方失败了。

    我的标签中没有任何内容:EvoluciónVisitas。其他一切都还可以。

    这是我的数据:

    structure(list(date = structure(1:31, .Label = c("2014-12-01", 
    "2014-12-02", "2014-12-03", "2014-12-04", "2014-12-05", "2014-12-06", 
    "2014-12-07", "2014-12-08", "2014-12-09", "2014-12-10", "2014-12-11", 
    "2014-12-12", "2014-12-13", "2014-12-14", "2014-12-15", "2014-12-16", 
    "2014-12-17", "2014-12-18", "2014-12-19", "2014-12-20", "2014-12-21", 
    "2014-12-22", "2014-12-23", "2014-12-24", "2014-12-25", "2014-12-26", 
    "2014-12-27", "2014-12-28", "2014-12-29", "2014-12-30", "2014-12-31"
    ), class = "factor"), sessions = c(1932L, 1828L, 2349L, 8192L, 
    3188L, 3277L, 2846L, 2541L, 5434L, 4290L, 2059L, 2080L, 2111L, 
    3776L, 1989L, 1844L, 3641L, 1283L, 1362L, 1568L, 2882L, 1212L, 
    957L, 851L, 928L, 1435L, 1115L, 1471L, 1128L, 1022L, 768L), id = 1:31), .Names = c("date", 
    "sessions", "id"), row.names = c(NA, -31L), drop = TRUE, class = c("tbl_df", 
    "tbl", "data.frame"))
    

    这是我的代码,谢谢。

    ui.R

    library(shiny)
    library(ggvis)
    
    # Define the overall UI
    shinyUI(
    
      # Use a fluid Bootstrap layout
      fluidPage(    
    
        # Give the page a title
        br(),
        br(),
        titlePanel("Visitas por fuente"),
    
        # Generate a row with a sidebar
        sidebarLayout(      
    
          # Define the sidebar with one input
    
    
    
          sidebarPanel(
            dateRangeInput("dates", label = h3("Date range"),
                           start = "2014-12-01", end = "2014-12-31")
    
          ),
    
    
          mainPanel(
            tabsetPanel(
              tabPanel('Visitas por fuente',
                       plotOutput("VisitasFuente")),
              tabPanel('Evolución de las visitas',
                       ggvisOutput("EvolucionVisitas")),
              tabPanel('Comentarios',
                       dataTableOutput("Comentarios"))
            )
    
        )
      )
    ))
    

    server.R

    library(shiny)
    library(ggvis)
    
    
    
    Visitas_Por_Fuente <- read.csv("D:\\RCoursera\\Star-App-2\\Visitas_Por_Fuente_Dic.csv")
    labelsF = c("Directo", "Email", "Referencias", "SEO", "Social Media", "Campañas", "Adwords")
    Visitas_Por_Fuente$date <- as.Date(Visitas_Por_Fuente$date)
    ComentariosDic <- read.csv("D:\\RCoursera\\Star-App-2\\ComentariosDic2014.csv",header = TRUE, sep = ";")
    ComentariosDic$date <- as.Date(ComentariosDic$date)
    
    
    shinyServer(
    
    
      function(input, output) {
    
    
    
        output$VisitasFuente <- renderPlot({
    
          # Filter the data based on user selection month     
          date_seq <- seq(input$dates[1], input$dates[2], by = "day")
    
    
          VisitasData <- filter(Visitas_Por_Fuente, date %in% date_seq  & Fuentes %in% labelsF)
    
          VisitasData <- VisitasData %>% group_by(Fuentes) %>%
                                         summarise(sessions = sum(sessions))
    
    
    
    
          # Bar graph using ggplot2 library 
          ggplot(VisitasData, aes(factor(Fuentes), sessions, fill = Fuentes)) + 
            geom_bar(stat="identity", position = "dodge") +
            geom_text(aes(label = comma(sessions)), position=position_dodge(width=0.9), vjust=-0.25) +
            scale_fill_manual(breaks = c("0", "1", "3", "6", "9", "12", "15"),
                              labels = labelsF,
                              values = c("#E69F00", "#56B4E9", "#009E73", 
                                         "#F0E442", "#0072B2", "#A082F8", "#F072A2"))
    
        })
    
        **############# Evolución de las visitas ##############################################
        #####################################################################################**
    
    
        output$EvolucionVisitas <- renderPlot({
    
          # Filter the data based on user selection month     
          date_seq <- seq(input$dates[1], input$dates[2], by = "day")
    
    
          EvolucionVisitas <-  filter(Visitas_Por_Fuente, date %in% date_seq) 
    
    
          mysessions <- function(x) {
            if(is.null(x)) return(NULL)
            #notice below the id column is how ggvis can understand which session to show 
            row <- EvolucionVisitas[EvolucionVisitas$id == x$id, ]
            #prettyNum shows the number with thousand-comma separator  
            paste0("Sessions:", "&nbsp;",prettyNum(row$sessions, big.mark=",",scientific=F)) 
          }
    
    
    
    
          EvolucionVisitas %>% 
            ggvis(x= ~date, y= ~sessions, key := ~id) %>%
            layer_points()  %>%
            add_tooltip(mysessions ,"hover") %>%
            layer_paths() %>%
            add_axis("x", value=c(as.character(EvolucionVisitas$date[1]),as.character(EvolucionVisitas$date[round(length(EvolucionVisitas$date)/2,0)]),
                                  as.character(tail(EvolucionVisitas$date, n=1)))) %>%
            bind_shiny("EvolucionVisitas")
    
    
    
    
    
    
    
        #####################################################################################
        #####################################################################################
    
    
        output$Comentarios = renderDataTable({
    
          date_seq <- seq(input$dates[1], input$dates[2], by = "day")
    
    
          ComentariosDic <- filter(ComentariosDic, date %in% date_seq)
    
          ComentariosDic <- filter(ComentariosDic, !grepl("^$", Comentarios))
    
    
        })
    
    })
    

3 个答案:

答案 0 :(得分:1)

您在server.R中的代码开始

  output$EvolucionVisitas <- renderPlot({

你可以尝试将它包裹在这样的反应中,而不是renderPlot

vis <- reactive({

# Filter the data based on user selection month     
      date_seq <- seq(input$dates[1], input$dates[2], by = "day")


      EvolucionVisitas <-  filter(Visitas_Por_Fuente, date %in% date_seq) 


      mysessions <- function(x) {
        if(is.null(x)) return(NULL)
        #notice below the id column is how ggvis can understand which session to show 
        row <- EvolucionVisitas[EvolucionVisitas$id == x$id, ]
        #prettyNum shows the number with thousand-comma separator  
        paste0("Sessions:", "&nbsp;",prettyNum(row$sessions, big.mark=",",scientific=F)) 
      }

myvis <-
    ggvis(x= ~date, y= ~sessions, key := ~id) %>%
        layer_points()  %>%
        add_tooltip(mysessions ,"hover") %>%
        layer_paths() %>%
        add_axis("x", 

    value=c(as.character(EvolucionVisitas$date[1]),as.character(EvolucionVisitas$date[round(length(EvolucionVisitas$date)/2,0)]),
                                  as.character(tail(EvolucionVisitas$date, n=1)))) 


    myvis
    })

然后在反应性放置之外:

vis %>% bind_shiny("EvolucionVisitas")

我想我在做一个闪亮的/ ggvis时会记得类似的东西 - 我的代码在我的github上:https://github.com/jalapic/shinyapps/tree/master/soccerteams它可能会有所帮助。

答案 1 :(得分:1)

仅对ggvis进行故障排除,问题主要在于您尝试自定义x轴。 ggvis试图通过将日期解释为时间来变得聪明。出于这个情节的目的,我认为最好将它们视为因素。

这是一个完全可重复的答案。

shiny::runGist("https://gist.github.com/cdeterman/0ac102cd68a7987a8a90")

您会注意到其他一些差异。最好使数据集具有反应性,这样您就可以在多个地方重复使用它,而无需额外的开销。另外,正如@jalapic最初建议的那样,你想让你的ggvis对象被反应,所以情节可以是动态的,并使用漂亮的工具提示。

答案 2 :(得分:0)

哇......那有点乱。我将它剥离到ggvis部分,并试图让它运行。请查看此gist

您可以使用以下命令运行它:

shiny::runGist("https://gist.github.com/corynissen/f75ecae388f81be13436")