如何基于反应式if语句执行几个反应式功能

时间:2019-01-11 10:08:04

标签: r dataframe shiny reactive

我正在基于https://www.kaggle.com/c/bike-sharing-demand上的Bikesharing数据构建我的第一个Shiny交互式应用程序。用户可以通过单选按钮选择“起点站”或“终点站”,然后应在地图上接收圆圈标记,其半径为特定自行车站是特定日期旅行的起点/终点的计数。

我有一个带有跳闸数据的数据框(df.trip),还有一个带有每个站的坐标的数据框(df.station)。根据用户的选择,我将不得不使用'from_station_id'或'to_station_id'离开df.station,以查找起点/终点站的坐标。

我已经在用户界面中实现了单选按钮,并且已经具有日期功能。但是,我已经尝试了许多选项来获得反应式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)
   }



   })````


1 个答案:

答案 0 :(得分:0)

该错误是由于您试图在$columns[0] = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $columns[0]); 函数外部呈现传单地图而引起的。您还可以将renderLeaflet部分缩小到相关部分,并将其全部包含在if调用中。

因此,如果您已使用renderLeaflet在用户界面中设置了传单地图,那么它应该可以在服务器中使用:

leafletOutput(outputId = "map")