gpt4 book ai didi

r - 在 Shiny 的传单 map 上控制点过滤的最有效方法

转载 作者:行者123 更新时间:2023-12-04 12:35:35 24 4
gpt4 key购买 nike

我正在开发 shiny具有 leaflet 的应用程序 map 。 map 的源数据集包括纬度、经度和其他几个变量。我为应用程序的用户提供与这些其他变量相关的单选按钮、 slider 、复选框等,其效果是控制哪些点出现在 map 上。

我在下面包含了我的代码的基本示例。我目前正在将我的数据集预拆分为子集,然后可以将其调用到 leaflet通过 react 表达式(基于用户选择的内容)。这只是一个只有 4 个子集的简单示例,因此在这里看起来可能还不错。但是,在我的实际用例中,应用程序用户可以选择的过滤器的潜在组合会更多。

是否建议创建所有可能在 Global.R 脚本中过滤的潜在子数据集?还是应该在响应式(Reactive)表达式中即时进行过滤?

此外,是否有替代使用巨大的嵌套 ifelse 表达式(就像我下面的相对较小的表达式)?随着我向我的实际应用程序添加更多用户过滤选项,这种情况已经失控。我不完全理解响应式(Reactive)表达式的更新顺序,因为它可能取决于多个输入。

如果我与所有过滤排列共享一段巨大的代码,我的问题的动机可能会更清楚,但想先提供一个更简单的例子:

    library(shiny)
library(leaflet)
library(dplyr)

# Generating dummy data for demonstration
member <- 1:10
lat <- c(39.8, 39.6, 39.7, 39.78, 39.82, 39.74, 39.72, 38.9, 37.43, 38.0)
lon <- c(-86.1, -86.2, -86.3,-86.4,-86.5,-86.6,-86.7,-86.8,-86.9, -87)
group <- c("a","a","a","b","b","a","a","a","b","b")
year <- c(1,0,0,1,0,1,0,0,1,0)
data <- data.frame(member, lat, lon, group, year)

# Creating data subsets for plotting
groupA_y1 <- data %>% filter(group == "a", year == 1)
groupA_y0 <- data %>% filter(group=="a", year == 0)
groupB_y1 <- data %>% filter(group=="b", year == 1)
groupB_y0<-data %>% filter(group=="b", year == 0)


ui <- fluidPage(
leafletOutput("mymap"),
radioButtons("group", "Group:", c("A", "B"), selected = "A"),
radioButtons("year", "Year", c(1,0), selected = 1)
)



server <- function(input, output, session) {

output$mymap <- renderLeaflet({
leaflet() %>%
addProviderTiles("CartoDB.Positron",
options = providerTileOptions(noWrap = TRUE)) %>%
setView(lng = -85.00, lat = 39.00, zoom = 6)
})


zerg <-reactive({
test<-ifelse(input$group=="A" & input$year==1, return(groupA_y1),
ifelse(input$group=="A" & input$year==0, return(groupA_y0),
ifelse(input$group=="B" & input$year==1, return(groupB_y1),
return(groupB_y0))))
return(test)
})



observe({
dataset<- zerg()

leafletProxy("mymap", data = dataset) %>%
clearMarkers() %>%
addCircleMarkers(~lon, ~lat, layerId=~member,
stroke=FALSE, fillOpacity=0.9, fillColor="Red")

})
}

shinyApp(ui, server)

最佳答案

对于过滤,我想这取决于每次过滤实际需要多少时间。如果只需要几秒钟,用户等待可能是可以的。如果需要 20 秒,并且每次更改参数时都需要等待,那么在开始时进行过滤可能会很好,这样您可以有一个加载标志一分钟左右。

对于ifelse ,您可以使用 dataframe直接获取你想要的数据集。例如,使用您发布的代码,您可以在全局部分执行以下操作:

chooseDataset <- data.frame(group=rep(c("a","b"),each=2),year=rep(c(1,0),2))
chooseDataset$dataset <- paste0("group",toupper(chooseDataset$group),"_y",chooseDataset$year)

observe你在哪里有 leafletProxy :
dataset<- with(chooseDataset,chooseDataset[group==input$group & year=input$year,"dataset"])

关于r - 在 Shiny 的传单 map 上控制点过滤的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34816204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com