【发布时间】:2017-07-06 19:39:39
【问题描述】:
当我在闪亮应用程序中使用的数据集没有数据时,会出现错误:下标超出范围 - 并且应用程序保持空白,没有我的地图。我希望即使发生错误,地图也会出现但带有任何标记。我怎样才能做到这一点?
您好,我正在使用 R shiny 和小册子开发一个应用程序,该应用程序提供带有标记的地图,每次单击标记时,都会出现一个包含该特定标记信息的表格。此外,我还有一个通过 if/else 语句开发的侧栏,因此我可以搜索我想要的信息。解释一下,我可以搜索有关特定年份、那一年期间、特定条件和该条件状态的信息。
一切运行良好,但唯一的问题是处理我的数据集中缺失的信息(我没有一年特定时期的数据)。当我没有数据时,闪亮的错误会发生“下标越界”。我希望除此之外,地图出现但没有标记。所以,只有简单的地图。我已经开发了 if 和 else 语句,但它们并不成功。即使发生闪亮错误,我如何保留地图?
我需要在服务器中更改什么吗?还是用户界面?
服务器代码:
pal <- colorFactor(c("lawngreen", "red", "darkgray", "yellow", "orange"),
domain = c("Confirmed negative", "Confirmed positive", "Don't know", "Likely negative", "Likely positive"))
shinyServer(function(input, output) {
data_for_map <- reactive({
if (input$disease_choice != "All") {
if (input$disease_quarter != "All") {
if (input$disease_status != "All") {
data_to_plot <- pig_data_long %>%
filter(disease == input$disease_choice, status == input$disease_status,
quarter == input$disease_quarter, year == input$disease_year)
} else {
data_to_plot <- pig_data_long %>%
filter(disease == input$disease_choice, quarter == input$disease_quarter, year == input$disease_year)
}
} else {
if (input$disease_status != "All") {
data_to_plot <- pig_data_long %>%
filter(disease == input$disease_choice, status == input$disease_status, year == input$disease_year)
} else {
data_to_plot <- pig_data_long %>%
filter(disease == input$disease_choice, year == input$disease_year)
}
}
} else {
if (input$disease_quarter != "All") {
if (input$disease_status != "All") {
data_to_plot <- pig_data_long %>%
filter(status == input$disease_status, quarter == input$disease_quarter, year == input$disease_year)
} else {
data_to_plot <- pig_data_long %>%
filter(quarter == input$disease_quarter, year == input$disease_year)
}
} else {
if (input$disease_status != "All") {
data_to_plot <- pig_data_long %>%
filter(status == input$disease_status, year == input$disease_year)
} else {
data_to_plot <- pig_data_long %>%
filter(year == input$disease_year)
}
}
}
output$map <- renderLeaflet({
leaflet("map") %>%
setView(lng = -3.64, lat = 57.36, zoom = 7) %>%
addTiles() %>%
addCircleMarkers(data = data_for_map()[[2]],
radius = 4,
color = "black",
stroke = FALSE,
fillOpacity = 1,
popup = ~(slapmark)) %>%
addCircleMarkers(data = data_for_map()[[1]],
color = ~pal(status),
stroke = FALSE,
fillOpacity = 1,
popup = ~(paste(quarter, disease, status, sep = ": ")),
layerId = ~(paste(slapmark, disease, status, sep = "-"))) %>%
addLegend("bottomright",
colors = c("lawngreen", "yellow", "orange", "red", "darkgray"),
labels = c("Confirmed negative", "Likely negative", "Likely positive", "Confirmed positive", "Don't know"),
title = "Legend",
labFormat = labelFormat(),
opacity = 1)
})
output$clicked = DT::renderDataTable({
point = input$map_marker_click
if (!is.null(point)) {
point_slapmark = strsplit(point$id, "-") [[1]][1]
data_for_map()[[1]] %>%
filter(slapmark == point_slapmark) %>%
select(-latitude, -longitude) %>%
DT::datatable(data_for_map, options = list(dom = 'ltipr'),
class = "display", callback = JS("return table;"),
style = "default")
}
})
})
【问题讨论】: