【问题标题】:How to execute several reactive functions based on reactive if statement如何基于响应式 if 语句执行多个响应式函数
【发布时间】:2019-06-06 05:53:24
【问题描述】:

我正在使用来自https://www.kaggle.com/c/bike-sharing-demand 的 Bikesharing 数据构建我的第一个 Shiny 交互式应用程序。用户可以使用单选按钮选择“起点站”或“终点站”,然后应该在地图上接收圆形标记,其半径是某个自行车站是某一天旅行的起点/终点。

我有一个包含行程数据的数据框 (df.trip) 和一个包含每个站点坐标的数据框 (df.station)。根据用户的选择,我将不得不使用“from_station_id”或“to_station_id”离开加入 df.station,以便找到起点/终点站的坐标。

我已经在 UI 中实现了单选按钮并且已经有了日期功能。但是,我尝试了许多选项来获得一个响应式 if 语句,该语句根据用户选择在不同的键上连接数据帧。在 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)
   }



   })````


【问题讨论】:

    标签: r dataframe shiny reactive


    【解决方案1】:

    错误是由于您试图在renderLeaflet 函数之外呈现传单地图。您还可以将if 部分缩减为相关部分,并将其全部包含在您的renderLeaflet 调用中。

    因此,如果您在 UI 中使用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)
    })
    

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      相关资源
      最近更新 更多