因为很多天我无法解决我的问题 . 一开始我从API获取一些数据(我每隔5秒刷新一次API调用以获取最新数据) . 数据包含有关位置(纬度和长度)的信息以及写入这些位置的一些标签 . 我想创建一个selectInput对象并使用分配给标签的选项 . 如果我从selectInput对象的下拉列表中选择一个标签,我想在5秒内同时过滤下一个API调用 . 主要任务是在从下拉列表中选择值后过滤 Map 上可见的数据 .
标签每隔几分钟更换一次,但位置坐标每隔几秒就会改变一次 .
我在服务器端使用renderUI,在UI端使用uiOutput . 期待一些帮助,谢谢 .
library("httr")
library("jsonlite")
library("shiny")
library("leaflet")
library("dplyr")
ui
navbarPage("Title",
tabPanel("MAP",
leafletOutput("mymap", width = "auto", height = "560px")
)
),
uiOutput("loc")
)
)
server
autoInvalidate
reData
# # example data
# lat
# long
# labels
# data
# API call #1 response
get_data
get_data_text
get_data_json
data
# handling empty API response
while(class(data) == "list"){
Sys.sleep(1)
get_trams
get_data_text
get_data_json
data
}
# saving data before filtering - purpose of getting labels for the drop-down list and
# creating a sorted list for selectInput function
list_of_vals
uniq_first_lines
sorted_factor
my_new_list
# filter data
if(input$loc != "all") {
data %
filter_at(
vars(one_of("FirstLine")),
any_vars(.==input$loc))
}
rownames(data)
return(list(data=data, my_new_list=my_new_list))
}, ignoreNULL = FALSE)
output$loc
selectInput("loc", label = h4("Choose location"),
choices = reData()$my_new_list ,selected = "all"
)
})
points
cbind(reData()$trams_data$Lon, reData()$trams_data$Lat)
},ignoreNULL = FALSE)
labels
paste("line: ", reData()$trams_data$FirstLine)
},ignoreNULL = FALSE)
output$mymap
leaflet() %>%
addTiles()
})
observeEvent(autoInvalidate(), {
leafletProxy("mymap") %>%
clearMarkers() %>%
addMarkers(
data = points(),
label = labels()
)
},ignoreNULL = FALSE)
})
shinyApp(ui, server)