R: Shiny / Ggvis - daterangeInput: гистограмма меняется, а всплывающая подсказка - нет

Мой график меняется, я знаю, что это приводит к тому, что ось Y меняет свои пределы. Но всплывающая подсказка для каждой панели одинакова, независимо от того, меняю ли я диапазон дат.

Как видите, для источника «Директо» написано: «Общее количество сеансов: 11 610». Это на весь месяц Дайембер. Однако, если я изменю даты с «2014-12-01» на «2014-12-01», чтобы увидеть данные только за первый день месяца, столбцы меняются, но всплывающая подсказка продолжает говорить: «Всего количество сессий: 11 610 »для« Дирекции ».

Я думаю, это проблема с моей функцией "mysessions" для части подсказки, которая не распознает подмножество данных при изменении daterangeInput. Но не могу понять.

введите описание изображения здесь

Мой server.R: ### Вы можете увидеть мои данные из "dput ()" в конце.

library(dplyr)
library(ggvis)
library(shiny)


Visitas_Por_Fuente <- read.csv("D:\\RCoursera\\Star- App3\\Visitas_Por_Fuente_Dic.csv")   ## Call it from a CSV file, but you can see the dput() data at the end of the post.                                                                          
Visitas_Por_Fuente$date <- as.Date(Visitas_Por_Fuente$date)


shinyServer(
  function(input, output, session){

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



      return(EvolucionVisitas)

    })

    ############# Evolución de las visitas ##############################################
    #####################################################################################**

    myvis <- reactive({


      EvolucionVisitas <- myData()

      mysessions <- function(x) {
        if(is.null(x)) return(NULL)
        # compute the total number of sessions of the "Fuente" type that is hovered over
        total_sessions <- sum(EvolucionVisitas[EvolucionVisitas$Fuentes == x$Fuentes, "sessions"])
        # format the value with prettyNum if you like:
        paste0("Total number of Sessions:", "&nbsp;",
               prettyNum(total_sessions, big.mark=",",scientific=F))
      }


      outvis <-
        EvolucionVisitas %>%
        ggvis(~Fuentes, ~sessions) %>%
        layer_bars(width = 0.8, fill = ~Fuentes) %>%
        add_tooltip(mysessions ,"hover")
      return(outvis)
    })

    myvis %>% bind_shiny("EvolucionVisitas")
  }
) 

My ui.R:

library(shiny)
library(ggvis)
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('Evolución de las visitas',
                   ggvisOutput("EvolucionVisitas"))
        )
      )
    )
  )
) 

Мои данные: # необходимо преобразовать с использованием as.data.frame. Что-то происходит с функцией group_by из dplyr.

as.data.frame(structure(list(date = structure(c(1417410000, 1417410000, 1417410000, 
1417410000, 1417410000, 1417410000, 1417496400, 1417496400, 1417496400, 
1417496400, 1417496400, 1417496400, 1417496400, 1417582800, 1417582800, 
1417582800, 1417582800, 1417582800, 1417582800, 1417582800, 1417669200, 
1417669200, 1417669200, 1417669200, 1417669200, 1417669200, 1417669200, 
1417755600, 1417755600, 1417755600, 1417755600, 1417755600, 1417755600, 
1417842000, 1417842000, 1417842000, 1417842000, 1417842000, 1417842000, 
1417842000, 1417928400, 1417928400, 1417928400, 1417928400, 1417928400, 
1417928400, 1417928400, 1418014800, 1418014800, 1418014800, 1418014800, 
1418014800, 1418014800, 1418014800, 1418101200, 1418101200, 1418101200, 
1418101200, 1418101200, 1418101200, 1418101200, 1418187600, 1418187600, 
1418187600, 1418187600, 1418187600, 1418187600, 1418187600, 1418274000, 
1418274000, 1418274000, 1418274000, 1418274000, 1418274000, 1418274000, 
1418360400, 1418360400, 1418360400, 1418360400, 1418360400, 1418360400, 
1418360400, 1418446800, 1418446800, 1418446800, 1418446800, 1418446800, 
1418446800, 1418446800, 1418533200, 1418533200, 1418533200, 1418533200, 
1418533200, 1418533200, 1418533200, 1418619600, 1418619600, 1418619600, 
1418619600, 1418619600, 1418619600, 1418619600, 1418706000, 1418706000, 
1418706000, 1418706000, 1418706000, 1418706000, 1418706000, 1418792400, 
1418792400, 1418792400, 1418792400, 1418792400, 1418792400, 1418792400, 
1418878800, 1418878800, 1418878800, 1418878800, 1418878800, 1418878800, 
1418878800, 1418965200, 1418965200, 1418965200, 1418965200, 1418965200, 
1418965200, 1418965200, 1419051600, 1419051600, 1419051600, 1419051600, 
1419051600, 1419051600, 1419051600, 1419138000, 1419138000, 1419138000, 
1419138000, 1419138000, 1419138000, 1419224400, 1419224400, 1419224400, 
1419224400, 1419224400, 1419224400, 1419224400, 1419310800, 1419310800, 
1419310800, 1419310800, 1419310800, 1419310800, 1419397200, 1419397200, 
1419397200, 1419397200, 1419397200, 1419397200, 1419397200, 1419483600, 
1419483600, 1419483600, 1419483600, 1419483600, 1419483600, 1419483600, 
1419570000, 1419570000, 1419570000, 1419570000, 1419570000, 1419570000, 
1419656400, 1419656400, 1419656400, 1419656400, 1419656400, 1419656400, 
1419742800, 1419742800, 1419742800, 1419742800, 1419742800, 1419742800, 
1419742800, 1419829200, 1419829200, 1419829200, 1419829200, 1419829200, 
1419829200, 1419915600, 1419915600, 1419915600, 1419915600, 1419915600, 
1419915600, 1419915600, 1420002000, 1420002000, 1420002000, 1420002000, 
1420002000), class = c("POSIXct", "POSIXt"), tzone = "America/Lima"), 
    Fuentes = c("Adwords", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Adwords", "Campañas", "Directo", 
    "Email", "Referencias", "SEO", "Social Media", "Adwords", 
    "Campañas", "Directo", "Email", "Referencias", "SEO", "Social Media", 
    "Adwords", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Adwords", "Campañas", "Directo", 
    "Email", "Referencias", "SEO", "Social Media", "Adwords", 
    "Campañas", "Directo", "Email", "Referencias", "SEO", "Social Media", 
    "Adwords", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Adwords", "Campañas", "Directo", 
    "Email", "Referencias", "SEO", "Social Media", "Adwords", 
    "Campañas", "Directo", "Email", "Referencias", "SEO", "Social Media", 
    "Adwords", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Adwords", "Campañas", "Directo", 
    "Email", "Referencias", "SEO", "Social Media", "Adwords", 
    "Campañas", "Directo", "Email", "Referencias", "SEO", "Social Media", 
    "Adwords", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Adwords", "Campañas", "Directo", 
    "Email", "Referencias", "SEO", "Social Media", "Adwords", 
    "Campañas", "Directo", "Email", "Referencias", "SEO", "Social Media", 
    "Adwords", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Adwords", "Campañas", "Directo", 
    "Email", "Referencias", "SEO", "Social Media", "Adwords", 
    "Campañas", "Directo", "Email", "Referencias", "SEO", "Social Media", 
    "Adwords", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Adwords", "Campañas", "Directo", 
    "Email", "Referencias", "SEO", "Social Media", "Campañas", 
    "Directo", "Email", "Referencias", "SEO", "Social Media", 
    "Adwords", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Adwords", "Campañas", "Directo", 
    "Email", "Referencias", "SEO", "Social Media", "Campañas", 
    "Directo", "Email", "Referencias", "SEO", "Social Media", 
    "Campañas", "Directo", "Email", "Referencias", "SEO", "Social Media", 
    "Adwords", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Campañas", "Directo", "Email", "Referencias", 
    "SEO", "Social Media", "Adwords", "Campañas", "Directo", 
    "Email", "Referencias", "SEO", "Social Media", "Directo", 
    "Email", "Referencias", "SEO", "Social Media"), sessions = c(10L, 
    326L, 18L, 527L, 999L, 52L, 3L, 7L, 324L, 19L, 498L, 933L, 
    44L, 5L, 12L, 363L, 15L, 546L, 1206L, 202L, 7L, 12L, 1122L, 
    27L, 1249L, 5168L, 607L, 17L, 432L, 22L, 527L, 1553L, 637L, 
    5L, 5L, 356L, 16L, 507L, 1901L, 487L, 4L, 8L, 312L, 30L, 
    500L, 1622L, 370L, 3L, 11L, 341L, 18L, 504L, 1312L, 352L, 
    2L, 13L, 1188L, 33L, 682L, 2008L, 1508L, 3L, 15L, 1086L, 
    36L, 646L, 2124L, 380L, 3L, 11L, 355L, 17L, 383L, 1054L, 
    236L, 2L, 9L, 321L, 15L, 370L, 1118L, 245L, 7L, 9L, 259L, 
    13L, 332L, 1261L, 230L, 3L, 7L, 539L, 9L, 626L, 2336L, 256L, 
    1L, 12L, 292L, 8L, 386L, 1070L, 220L, 1L, 12L, 278L, 9L, 
    393L, 1129L, 22L, 1L, 16L, 521L, 18L, 665L, 2400L, 20L, 1L, 
    13L, 204L, 7L, 258L, 789L, 11L, 2L, 12L, 253L, 6L, 277L, 
    803L, 9L, 1L, 4L, 262L, 8L, 324L, 960L, 9L, 3L, 442L, 15L, 
    516L, 1890L, 16L, 2L, 14L, 249L, 8L, 240L, 688L, 11L, 15L, 
    182L, 7L, 200L, 548L, 5L, 2L, 3L, 171L, 7L, 183L, 480L, 5L, 
    1L, 3L, 176L, 5L, 231L, 506L, 6L, 15L, 283L, 18L, 322L, 786L, 
    11L, 13L, 210L, 9L, 232L, 649L, 2L, 1L, 2L, 258L, 4L, 306L, 
    891L, 9L, 4L, 183L, 10L, 293L, 634L, 4L, 1L, 3L, 188L, 9L, 
    244L, 566L, 11L, 134L, 1L, 176L, 453L, 4L)), .Names = c("date", 
"Fuentes", "sessions"), row.names = c(NA, -208L), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), vars = list(date), drop = TRUE))

person Omar Gonzales    schedule 16.02.2015    source источник
comment
в вашем dput нет столбца даты, поэтому код не запускается   -  person NicE    schedule 16.02.2015
comment
@NicE, я изменил данные dput. Теперь это правильно. Мне пришлось группировать_би (дата, Фуэнтес), а затем резюмировать (сеансы = сумма (сеансы)). Любая помощь приветствуется.   -  person Omar Gonzales    schedule 16.02.2015


Ответы (1)


По какой-то причине, если пользовательская функция tool_tip будет использоваться как реактивная, то функция должна быть определена вне реактивного контекста. Даже добавление функции непосредственно в код ggvis не приведет к обновлению изменяющихся данных. Просто переместив mysessions функцию над реактивным ggvis графиком, ваш код будет работать нормально.

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

У меня недостаточно глубокого понимания механики внутри блестящего, чтобы объяснить, почему это так. Возможно, вам нужно будет перейти к проблемам на странице github и посмотреть, сможет ли кто-нибудь объяснить это лучше, если вам интересно узнать конкретную причину.

person cdeterman    schedule 16.02.2015
comment
cdeterman, я пробовал ваш Gist, но при зависании получил: Warning: Unhandled error in observer: object 'EvolucionVisitas' not found observe({ value <- session$input[[id]] if (is.null(value)) return() if (!is.list(value$data)) return() df <- value$data class(df) <- "data.frame" attr(df, "row.names") <- .set_row_names(1L) fun(data = df, location = list(x = value$pagex, y = value$pagey), session = session) }). Кроме того, я изменил данные dput (), теперь они верны. Пожалуйста, посмотрите мои комментарии к NicE - person Omar Gonzales; 16.02.2015
comment
@OmarGonzales, я обновил суть. Набор данных нужно было вызвать в tool_tip. Кроме того, не уверен, что structure ваши обновленные данные, но их нужно преобразовать в data.frame. - person cdeterman; 16.02.2015
comment
работает отлично. И да, данные, которые необходимо преобразовать в data.frame (с as.data.frame ()), я думаю, это из-за функции group_by из dplyr, которую я использовал. Спасибо еще раз. - person Omar Gonzales; 16.02.2015
comment
Рад помочь, обязательно примите ответ :) - person cdeterman; 16.02.2015
comment
Можете ли вы изучить это подмножество из функции mysessions: total_sessions <- sum(EvolucionVisitas[EvolucionVisitas$Fuentes == x$Fuentes, "sessions"]), в вашем ответе. Я знаю подмножество, но мне любопытно, как это работает. - person Omar Gonzales; 17.02.2015