闪亮的+Leaflet响应式功能不起作用

3

我的数据包含了像经度、纬度、地区、房屋类型和年份等列。我使用leaflet和shiny创建了一个带有聚合标记的地图。

我添加了两个selectInput框,一个用于选择年份,另一个用于选择房屋类型。使用reactive函数时,每当我运行shiny应用程序时,它都会给出以下错误信息:

Error: Don't know how to get location data from object of class reactiveExpr,reactive

这是我的代码:

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

ui <- fluidPage(
    titlePanel("Transactions for Resale Flats"),
    h3("Model A Flats: 3-Room, 4-Room, 5-Room"),
    sidebarLayout(position = 'right',
        sidebarPanel(
            selectInput("year","Year", choices = c("2007","2008",
                                                   "2009","2010","2011",
                                                   "2012","2013","2014",
                                                   "2015","2016","2017"), selected="2007"),

            selectInput("type","Flat-Type",choices = c("3 ROOM",'4 ROOM',"5 ROOM"),selected = "3-Room"),
            width = 2),
        mainPanel(leafletOutput("mymap",height = 650,width=605)))


)


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

    headlinedata<-reactive({
        headlinedata%>%
            filter(year %in% input$year & flat_type %in% input$type)
    })

    output$mymap <- renderLeaflet({
        leaflet(data=headlinedata) %>% 
            addTiles() %>% 
            addMarkers(clusterOptions = markerClusterOptions(),
            label = paste(headlinedata$address,',',headlinedata$town))

          })

    observe(leafletProxy('mymap', data=headlinedata()))%>%
    clearMarkers()%>%
    addMarkers(clusterOptions = markerClusterOptions(),
               label = paste(headlinedata$address,',',headlinedata$town))

}

shinyApp(ui = ui, server = server)

此代码也是如此

  observe(leafletProxy('mymap', data=headlinedata()))%>%
        clearMarkers()%>%
        addMarkers(clusterOptions = markerClusterOptions(),
                   label = paste(headlinedata$address,',',headlinedata$town))

每当我加入这个代码时,应用程序运行一秒钟然后立即关闭。这段代码的作用是在输入更改时更新地图标记。
谢谢。
1个回答

1
首先,您需要将反应变量称为变量名称后跟()。在output$mymap中,您引用了要过滤的数据帧headlinedata,而应该是已经被过滤的反应变量headlinedata()。为了消除歧义,我将反应变量的名称更改为df。然后,在代码下游需要该反应变量时,我将其称为df()
其次,由于df()是一个反应变量,我们已经设置了叶片依赖它,每当反应变量发生变化时,地图也会发生变化。这意味着我们不需要observe(leafletProxy ...代码。
以下是可复制粘贴的可重现示例。
library(shiny)
library(leaflet)
library(dplyr)

set.seed(1)
headlinedata <- data.frame(year = rep(2007:2017, 10),
                           flat_type = sample(c("3 ROOM",'4 ROOM',"5 ROOM"),
                                         110, replace=T),
                           lat = sample(1:50,  110, replace=T),
                           lng = sample(1:50, 110, replace=T),
                           address = "address", 
                           town = "town")

ui <- fluidPage(
    titlePanel("Transactions for Resale Flats"),
    h3("Model A Flats: 3-Room, 4-Room, 5-Room"),
    sidebarLayout(position = 'right',
                  sidebarPanel(
                      selectInput("year","Year", choices = c("2007","2008",
                                                             "2009","2010","2011",
                                                             "2012","2013","2014",
                                                             "2015","2016","2017"), selected="2007"),

                      selectInput("type","Flat-Type",choices = c("3 ROOM",'4 ROOM',"5 ROOM"),selected = "3-Room"),
                      width = 2),
                  mainPanel(leafletOutput("mymap",height = 650,width=605)))


)


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

    df<-reactive({
        headlinedata%>%
            dplyr::filter(year %in% input$year & flat_type %in% input$type)
    })

    output$mymap <- renderLeaflet({
        leaflet(data=df()) %>% 
            addTiles() %>% 
            addMarkers(clusterOptions = markerClusterOptions(),
                       label = paste(df()$address,',',df()$town))

    })


}

shinyApp(ui = ui, server = server)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接