我正在基于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)
}
})````
答案 0 :(得分:0)
该错误是由于您试图在$columns[0] = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $columns[0]);
函数外部呈现传单地图而引起的。您还可以将renderLeaflet
部分缩小到相关部分,并将其全部包含在if
调用中。
因此,如果您已使用renderLeaflet
在用户界面中设置了传单地图,那么它应该可以在服务器中使用:
leafletOutput(outputId = "map")