R Shiny: как отфильтровать фрейм данных перед выводом объединенного фрейма SpatialPolygonsDataFrame на основе пользовательского интерфейса selectInput()?

#r #shiny #leaflet #spatial

#r #блестящий #брошюра #пространственный

Вопрос:

На данный момент я работаю над проектом информационной панели для отображения данных хранилища на карте-листовке. Мне удалось сделать это без какой-либо (реактивной) фильтрации входных данных. Функциональность, которую я хотел бы добавить, заключается в фильтрации хранилищ. С помощью этого фильтра пользователь может видеть данные для своего собственного хранилища вместо всех хранилищ на карте листовки.

Для того, чтобы создать новую карту листовки, load_data.R необходимо перезагрузить на основе ввода фильтра. Обратите внимание, что в load_data.R существует оператор where: ГДЕ ИМЯ_ХРАНЕНИЯ = @ВВОД ФИЛЬТРА В ui.R.

Мой вопрос к вам: как заполнить ‘@’ в операторе where в load_data.R на основе пользовательского интерфейса.R selectInput() для повторного объединения и замены фрейма SpatialPolygonsDataFrame (SalesMap), когда пользователь применяет фильтр?

load_data.R

 library(RSQLite)
library(rgdal)
library(dplyr)

# Use the SQLite database
my_sqdb = src_sqlite("Data/dataset.sqlite")

# Extract the main dataset out of the SQLite database
df = data.frame(tbl(my_sqdb, sql("SELECT * FROM df
                                  WHERE STORE_NAME = @INPUT OF THE FILTER IN ui.R")))

# Extract the stores with their locations out of the SQLite database
Winkels = data.frame(tbl(my_sqdb, sql("SELECT * FROM Winkels")))

# Read the shape-data(polygons) into R
shape <-readOGR("Data/Polygonen NL Postcodes 4PP.kml", "Polygonen NL Postcodes 4PP")

# Combine the main dataset with the shape data to plot data into zipcode areas
SalesMap <- merge(shape, df, by.x='Description', by.y='POSTCODE')
  

ui.R

 library(shiny)
library(shinydashboard)
library(leaflet)

source("R/load_metadata.R", chdir=TRUE)

# Header of the  dashboard
header <- dashboardHeader(
  title = "Demographic Dashboard",
  titleWidth = 350,
  dropdownMenuOutput("task_menu")

  )


# Side bar of the dashboard
sidebar <- dashboardSidebar(
  sidebarMenu(
    id = "menu_tabs",
    menuItem("Household Penetration", tabName = "menutab1", icon = icon("percent")),
    selectInput("STORE_NAME", label = "Store",
                choices = STOREFILTER$STORE_NAME,
                selected = STOREFILTER$STORE_NAME[1])
  )
)


# Body of the dashboard
body <- dashboardBody(
  tabItems(
    tabItem(
      tabName = "menutab1",
      tags$style(type = "text/css", "#mymap {height: calc(100vh - 80px) !important;}"),
      leafletOutput("mymap")
    )
  )
)


# Shiny UI
ui <- dashboardPage(
  header,
  sidebar,
  body
)
  

server.R

 #shiny
library(shiny)
library(shinydashboard)

#define color
library(RColorBrewer)
library(colorspace)

# leaflet map
library(leaflet)
library(htmlwidgets)
library(htmltools)

# Processing the data for output
source("R/load_data.R", chdir=TRUE)

## Creating leaflet map
pal <- colorNumeric("Reds", SalesMap@data$SALES)

polygon_popup <- paste0("<strong>ZIP: </strong>", SalesMap$Description, "<br>",
                        "<strong>Store: </strong>", SalesMap$STORE_NAME, "<br>",
                        "<strong>Value: </strong>", SalesMap$SALES, "%")

pop = as.character(Winkels$WINKEL)

Icon <- makeIcon(
  iconUrl = "Images/icon.png",
  iconWidth = 100, iconHeight = 78
)

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

  output$mymap <- renderLeaflet({

    leaflet() %>% 
      addTiles(
        urlTemplate = "//{s}.tiles.mapbox.com/v3/jcheng.map-5ebohr46/{z}/{x}/{y}.png",
        attribution = 'Maps by <a href="http://www.mapbox.com/">Mapbox</a>'
      )  %>%


      addPolygons(data = SalesMap,
                  fillColor = ~pal(SalesMap@data$SALES),         
                  fillOpacity = 0.6,  ## how transparent do you want the polygon to be? 
                  popup = polygon_popup,
                  color = "black",       ## color of borders between districts
                  weight = 2.0) %>%

      addMarkers(Winkels$Lon, Winkels$Lat, popup=pop, icon=Icon)

  })
}
  

Заранее спасибо.

Joris

Комментарии:

1. Если вы хотите использовать входные переменные, то команда sql должна находиться внутри вашей серверной группы и внутри реактивной среды. Вам нужно будет реорганизовать свой код вместо исходного кода в начале.

2. Спасибо за ваш комментарий. Это работает прямо сейчас!

Ответ №1:

Решение: «Если вы хотите использовать входные переменные, то команда sql должна находиться внутри вашей серверной группы и внутри реактивной среды. Вам нужно будет реорганизовать свой код вместо исходного кода в начале.»

Благодаря: warmoverflow

Код: server.R

  ## LOADING PACKAGES
 #shiny
 library(shiny)
 library(shinydashboard)

#define color
library(RColorBrewer)
library(colorspace)

# leaflet map
library(leaflet)

# Data processing
library(RSQLite)
library(rgdal)


## LOADING DATA
# Use the SQLite database
my_sqdb = src_sqlite("R/Data/dataset.sqlite")

# Extract the main dataset out of the SQLite database
df = data.frame(tbl(my_sqdb, sql("SELECT * FROM df")))

# Extract the stores with their locations out of the SQLite database
Winkels = data.frame(tbl(my_sqdb, sql("SELECT * FROM Winkels")))

# Read the shape-data(polygons) into R
shape <-readOGR("R/Data/Polygonen NL Postcodes 4PP.kml", "Polygonen NL Postcodes 4PP")


## LOADING SHINY SERVER
server <- function(input, output, session) {

  # Reactive dataset
  newData <- reactive({

    input$Button
      isolate({

                dfdf <- subset(df,
                               STORE_NAME == input$storeInput)

    })

    return(dfdf)

  })


  ## Creating Leaflet Map
  output$mymap <- renderLeaflet({

    dfdf = newData()

    SalesMap <- merge(shape, dfdf, by.x='Description', by.y='POSTCODE')

    ## Preparing colors, popups and icons for the leaflet map
    # Colorscale
    pal <- colorNumeric("Reds", SalesMap@data$SALES)

    # Popup for showing data in ZIP-area
    polygon_popup <- paste0("<strong>Postcode: </strong>", SalesMap$Description, "<br>",
                            "<strong>Store: </strong>", SalesMap$STORE_NAME, "<br>",
                            "<strong>Waarde: </strong>", SalesMap$SALES, "%")

    # Popup (with icon) for showing markers with store name
    pop = as.character(Winkels$WINKEL)

    # Creating Icon
    Icon <- makeIcon(
      iconUrl = "Images/icon.png",
      iconWidth = 100, iconHeight = 78
    )

    # Adding tiles, polygons and markers
    leaflet() %>% 
      addTiles(
        urlTemplate = "//{s}.tiles.mapbox.com/v3/jcheng.map-5ebohr46/{z}/{x}/{y}.png",
        attribution = 'Maps by <a href="http://www.mapbox.com/">Mapbox</a>'
      )  %>%


      addPolygons(data = SalesMap,
                  fillColor = ~pal(SalesMap@data$SALES),         
                  fillOpacity = 0.6,  ## how transparent do you want the polygon to be? 
                  popup = polygon_popup,
                  color = "black",       ## color of borders between districts
                  weight = 2.0) %>%

      addMarkers(Winkels$Lon, Winkels$Lat, popup=pop, icon=Icon)

  })
}