【问题标题】:ggvis integration with Shinyggvis 与 Shiny 的集成
【发布时间】:2015-02-10 02:54:53
【问题描述】:

这是一个相当简单的问题。我阅读了其他主题,发现为了将 GGVIS 可视化插入 Shiny,您需要:

  1. ui.R - 致电ggvisOutput("EvolucionVisitas")
  2. server.R - 使用函数bind_shiny("EvolucionVisitas")

我在为我的标签“Evolución Visitas”绘制图表时遇到问题。 我都做了,但我在某个地方失败了。

我的标签中没有任何内容: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"))
        )

    )
  )
))

服务器.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))


    })

})

【问题讨论】:

  • 您的数据不可重现,您的数据中缺少Fuentes

标签: r shiny ggvis


【解决方案1】:

仅对 ggvis 进行故障排除,您的问题主要是您尝试自定义 x 轴的结果。 ggvis 试图通过将日期解释为时间来变得聪明。就本图而言,我认为最好将它们视为因素。

这是一个完整的可重现答案。

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

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

【讨论】:

  • 请您将“ui.R”与“server.R”分开。以后我会在家里试试这个。谢谢。
  • @OmarGonzales,我分离了文件,这个解决方案对你有用吗?
  • @cderterman,我试过并得到:“在 127.0.0.1:4457 上侦听匹配错误(x,表,nomatch = 0L):'匹配'需要向量参数”。我无法完全测试它,以后再试一试。非常感谢。
  • @OmarGonzales,啊!我只是忘了包括这些包。我已经编辑了我的答案,以便像科里这样的要点更简洁。
  • 谢谢,我选择这个是因为它解释了我的错误,并准确给出了所需的输出(带有正确的 x 标签)。我只是将中间 X 标签的 round() 更改为 ceiling()。
【解决方案2】:

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")

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

【讨论】:

  • 我认为您缺少将 ggvis 代码应用于数据框。我试过你说的,但还是没有打印出来。
  • 哦,好吧,我发现在使用交互式工具提示时,我经常需要将我的 ggvis 代码放入反应式表达式中,然后将闪亮绑定到该反应式。 - 也许你的问题是别的东西
【解决方案3】:

呼……有点乱。我将它剥离到 ggvis 部分并试图让它运行。在此gist 中查看。

你可以运行它:

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

【讨论】:

  • 我已经尝试过了,但对 dateinputRange 按钮没有反应......但更改日期时图形不会改变。你可以查一下吗?谢谢! ——
  • 哦,我想你可以让它运行起来。我已经更新了要点。该图表现在与日期选择器交互。
  • 完美运行。只是 x 标签,只需要显示所选范围内的第一个、中间和最后一个日期,它实际上并没有这样做。我现在在工作,所以我无法完全测试它。我稍后会仔细检查。谢谢大佬。
猜你喜欢
  • 2016-09-20
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2014-08-24
  • 2015-05-06
  • 1970-01-01
相关资源
最近更新 更多