Как выполнить несколько реактивных функций на основе реактивного оператора if - PullRequest
0 голосов
/ 11 января 2019

Я создаю свое первое блестящее интерактивное приложение на данных о совместном использовании велосипедов из https://www.kaggle.com/c/bike-sharing-demand.. Пользователь может выбрать «Начальная станция» или «Конечная станция» с помощью радиокнопки, а затем должен получить круговые маркеры на карте с радиусом Подсчет определенной Станции Велосипеда был началом / концом поездки в определенный день.

У меня есть один кадр данных с данными о поездке (df.trip) и один кадр данных с координатами каждой станции (df.station). В зависимости от выбора пользователя, мне нужно будет оставить присоединение к df.station, используя 'from_station_id' или 'to_station_id', чтобы найти координаты начальной / конечной станции.

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

я получил Error in .getReactiveEnvironment()$currentContext() : Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)


    station_type <- reactive({
     if (toString(input$station)=="Start Station") {
       return(TRUE)
     } else {
       return(FALSE)
     }
   })


   if (station_type() == TRUE) {
     filtered <- reactive({
       df.trip %>%
         filter(format(df.trip$starttime,"%Y-%m-%d") == input$date) %>%
         group_by(from_station_id) %>%
         summarize(n_trips = n())
     )}

     tmp.df <- reactive({
         left_join(filtered(), df.station, by = c("from_station_id" = "station_id"))
       })

     leaflet(tmp.df()) %>%
       addTiles(group="OSM") %>%#OSM is default tile providor
       addProviderTiles(providers$CartoDB.Positron) %>%
       setView(
         lng=-122.335167,
         lat=47.608013,
         zoom=12
       )%>%
       addCircleMarkers(lng = ~long, lat = ~lat, weight = 1,label=~name,
                        radius = ~n_trips)
   }

   else {
     filtered <- reactive({
       df.trip %>%
         filter(format(df.trip$starttime,"%Y-%m-%d") == input$date) %>%
         group_by(to_station_id) %>%
         summarize(n_trips = n())
     )}

     tmp.df <- reactive({
       left_join(filtered(), df.station, by = c("to_station_id" = "station_id"))
     })

     leaflet(tmp.df()) %>%
       addTiles(group="OSM") %>%#OSM is default tile providor
       addProviderTiles(providers$CartoDB.Positron) %>%
       setView(
         lng=-122.335167,
         lat=47.608013,
         zoom=12
       )%>%
       addCircleMarkers(lng = ~long, lat = ~lat, weight = 1,label=~name,
                        radius = ~n_trips)
   }



   })````


1 Ответ

0 голосов
/ 11 января 2019

Ошибка из-за того, что вы пытаетесь отобразить карту листовки вне функции renderLeaflet. Вы также можете уменьшить секцию if до соответствующей части и включить все это в свой вызов renderLeaflet.

Так что, если вы настроили листовую карту в пользовательском интерфейсе с leafletOutput(outputId = "map"), это должно работать для вас на сервере:

output$map <- renderLeaflet({

  from_to <- input$station

  df <- df.trip %>%
    filter(format(df.trip$starttime,"%Y-%m-%d") == input$date)

  if (from_to == "Start Station") {
    df <- df %>% 
      group_by(from_station_id) %>%
      summarize(n_trips = n()) %>% 
      left_join(df.station, by = c("from_station_id" = "station_id"))
  } else {
    df <- df %>% 
      group_by(to_station_id) %>%
      summarize(n_trips = n()) %>% 
      left_join(df.station, by = c("to_station_id" = "station_id"))
  }

  leaflet(df) %>%
    addTiles(group="OSM") %>%#OSM is default tile providor
    addProviderTiles(providers$CartoDB.Positron) %>%
    setView(
      lng=-122.335167,
      lat=47.608013,
      zoom=12
    )%>%
    addCircleMarkers(lng = ~long, lat = ~lat, weight = 1,
                     label=~name, radius = ~n_trips)
})
...