我正在用 R 制作一个闪亮的仪表板。我需要做的是找到满足条件的位置(通过大型数据库上的 SQL Server 查询)。 我需要在单独的条形图中绘制与每个位置相关的数据,当在地图上单击该位置时会弹出该条形图。 更新注意:我已经尝试了 2 次尝试:第二组代码和错误如下。
我保留了一些输出 - 它看起来像这样:
小数:16 x 2 按行:
地点 | 情节 |
---|---|
chr | 列表 |
101502 | gg |
4101511 | gg |
etc(注意:位置列中的结果是预期的位置名称)
还有这样的错误消息:
文件中的警告(什么,“rb”): 无法打开文件“/tmp/Rtmpu0mwwl/filef4e3a1ee7acec.png”:没有这样的文件或目录 警告:文件错误:无法打开连接 [没有可用的堆栈跟踪]
所以看起来它在抱怨我尝试生成条形图的方式 会有很多酒吧——这是一个固有的问题吗?如果这是一个设计问题,我可能会制作一个表,按最大总和排序并使用 head 。 (在不太可能的情况下:有没有办法直接告诉 ggplot 进行排序,并且只绘制前 5 个总和?)
server <- function(input, output, session) {
plots <- reactive ({
#this comes from a selectize in the ui
req(input$hc)
hcname <- input$hc
con <- dbConnect(odbc::odbc(), Driver = "ODBC Driver 17 for SQL Server",
Server = DBServer, Database = "x", UID = DBUser,
PWD = DBPassword)
#query db to get a list of location names to make a second query
df_q1 <- dbGetQuery(... WHERE table.something = hcname ))
list_from_q1 <- df_q1$location
#second query
df_q2 <- dbGetQuery(.... WHERE paste(list_from_q1, collapse=" OR location ="))
# group, get a sum
df_q2_summary = df_q2 %>% group_by(location, b) %>% summarise(location, b, sumc = sum(c))
#I want to create a different bar plot for each location that you can click on in the map
plots <- df_q2_summary %>% group_by(location) %>% do(plots = ggplot(data = .) + aes(x = b, y = sumc) + geom_bar(stat= "identity")+ ggtitle(unique(.$location)))
})
df_q1_geom <- reactive ({
req(input$hc)
hcname <- input$hc
con <- dbConnect(odbc::odbc(), Driver = "ODBC Driver 17 for SQL Server",
Server = DBServer, Database = "x", UID = DBUser,
PWD = DBPassword)
#this is the same query as Query 1 in plots
df_q1 <- dbGetQuery(... WHERE table.something = hcname)
#inner join the locations of interest to a much spatial polygons data frame
df_q1_geom <- inner_join(shapefile.spdf, df_q1, by = "location")
})
output$mymap <- renderLeaflet({
leaflet()%>%
addPolygons(data = df_q1_geom(), popup = popupGraph(plots()), weight = 1.5, color = "light-blue", fillColor = "light-blue") %>%
addProviderTiles(providers$Esri.WorldStreetMap, options = providerTileOptions(opacity = 0.25))
})
}
shinyApp(ui = ui, server = server)
我发现我无法从 popupGraphs 中调用函数(如果我能的话那就太好了;-))。因此,我不是因为反应而将所有绘图生成为位置的子集,而是为每个位置生成了每个可能的绘图,而不仅仅是反应部分产生的位置子集。 这是数千个情节,但它起作用了(缓慢)。
我想要一种更快的方式。