2017-11-17 179 views
0

對於繁瑣的代碼,我很抱歉,但需要一些很好的幫助。空的SpatialPolygonsDataFrame對象已通過,並且將在Shiny中跳過

我將從printscreens

所以開始,5出的6個過濾器在我閃亮的應用程序的工作完美:

Filtering by country

Filtering by country

Filtering by indicator 1

Filtering by indicator 2

Filtering by indicator 3

的問題出現了,當我嘗試創建第六過濾器 - 所謂指示燈。 並呈現與三個最後一個過濾器相同的數據和格式。基本上我想結合指標過濾前三個指標。並通過三個指標之一來過濾所有7個項目的圈子(基於一個指標)。是否有意義?

但最後的代碼不起作用。它讓我錯誤

警告在polygonData.SpatialPolygonsDataFrame(數據):通過 空SpatialPolygonsDataFrame對象,並會被跳過

不幸的是,我沒有找到太多了。你可以看看代碼的末尾,叫指標,並幫助。我懷疑我至少在正確的數據子集方面存在問題。

數據可以採取here

形狀文件可以採取here

所以,代碼本身

# Projects and Results Dashboard 

# Packages (I played with different) 
library(shiny) 
library(shinythemes) 
library(leaflet) 
library(rgdal) 
library(tidyverse) 
library(geojsonio) 
library(RColorBrewer) 
library(highcharter) 
library(plotly) 
library(ggplot2) 
library(xlsx) 

# Set directory 
setwd("C:~/App Projects and Results") 

# Read csv, which was created specifically for this app 
projects <- read.csv("Sample data3.csv", header = TRUE) 
names(projects) 

# Read a shapefile 
countries <- readOGR(".","ne_50m_admin_0_countries") 

# Merge data 
projects.df <- merge(countries, projects, by.x = "name", by.y = "Country") 
class(projects.df) 

# UI code 
ui <- shinyUI(fluidPage(theme = shinytheme("united"), 
        titlePanel(HTML(# "<h1><center><font size=14> 
         "Projects and Results Dashboard" 
        #</font></center></h1>" 
        )), 
        sidebarLayout(
         sidebarPanel(
         selectInput("countryInput", "Country", 
            choices = c("Choose country", "Senegal", 
               "Nigeria", 
               "Cameroon", 
               "Dem. Rep. Congo", 
               "Rwanda", 
               "Tanzania", 
               "Madagascar"), 
            selected = "Choose country"), 
         selectInput("projectInput", "Project", 
            choices = c("Choose Project", 
               "Project 1", 
               "Project 2", 
               "Project 3", 
               "Project 4", 
               "Project 5", 
               "Project 6", 
               "Project 7"), 
            selected = "Choose Project"), 
         selectInput("totalInput", "Total Funds", 
            choices = c("Choose Project", 
               "Project 1", 
               "Project 2", 
               "Project 3", 
               "Project 4", 
               "Project 5", 
               "Project 6", 
               "Project 7"), 
            selected = "Choose Project"), 
         selectInput("cashInput", "Client Cash", 
            choices = c("Choose Project", 
               "Project 1", 
               "Project 2", 
               "Project 3", 
               "Project 4", 
               "Project 5", 
               "Project 6", 
               "Project 7"), 
            selected = "Choose Project"), 
         selectInput("clientInput", "Total Client", 
            choices = c("Choose Project", 
               "Project 1", 
               "Project 2", 
               "Project 3", 
               "Project 4", 
               "Project 5", 
               "Project 6", 
               "Project 7"), 
            selected = "Choose Project"), 
         selectInput("indicatorInput", "Indicator", 
            choices = c("Choose indicator", 
               "Total Funds ", 
               "Client Cash", 
               "Total Client" 
               ), 
            selected = "Choose indicator") 
        ), 

         mainPanel(leafletOutput(outputId = 'map', height = 800) 
        ) 
        ) 
)) 

# SERVER 

server <- shinyServer(function(input, output) { 
output$map <- renderLeaflet({ 
leaflet(projects.df) %>% 
    addProviderTiles(providers$Stamen.TonerLite) %>% 
    setView(11.0670977,0.912484, zoom = 4) 

}) 
# observers 

# selected country 
selectedCountry <- reactive({ 
projects.df[projects.df$name == input$countryInput, ] 
}) 
observe({ 
state_popup <- paste0("<strong>Country: </strong>", 
         selectedCountry()$name, 
         "<br><strong> Project: </strong>", 
         selectedCountry()$Project, 
         "<br><strong> Total Funds: </strong>", 
         selectedCountry()$Total.Funds, 
         "<br><strong>Client Cash: </strong>", 
         selectedCountry()$Client.Cash, 
         "<br><strong>Total Client: </strong>", 
         selectedCountry()$Total.Client) 


leafletProxy("map", data = selectedCountry()) %>% 
    clearShapes() %>% 
    addPolygons(fillColor = "blue", 
       popup = state_popup, 
       color = "#BDBDC3", 
       fillOpacity = 0.5, 
       weight = 1 
      ) 
}) 

# selected project 
selectedProject <- reactive({ 
tmp4 <- projects.df[!is.na(projects.df$Project),] 
tmp4[tmp4$Project == input$projectInput, ] 
}) 
observe({ 
state_popup4 <- paste0("<strong>Country: </strong>", 
         selectedProject()$name, 
         "<br><strong> Project: </strong>", 
         selectedProject()$Project, 
         "<br><strong> Total Funds: </strong>", 
         selectedProject()$Total.Funds, 
         "<br><strong>Client Cash: </strong>", 
         selectedProject()$Client.Cash, 
         "<br><strong>Total Client: </strong>", 
         selectedProject()$Total.Client) 


leafletProxy("map", data = selectedProject()) %>% 
    clearShapes() %>% 
    addPolygons(fillColor = "blue", 
       popup = state_popup4, 
       color = "#BDBDC3", 
       fillOpacity = 0.5, 
       weight = 1 
      ) 
}) 

# Total Funds 
selectedTotal <- reactive({ 
tmp <- projects.df[!is.na(projects.df$Project),] 
tmp[tmp$Project == input$totalInput, ] 
}) 
observe({ 
state_popup1 <- paste0("<strong>Country: </strong>", 
         selectedTotal()$name, 
         "<br><strong> Project: </strong>", 
         selectedTotal()$Project, 
         "<br><strong> Total Funds </strong>", 
         selectedTotal()$Total.Funds) 

leafletProxy("map", data = selectedTotal()) %>% 
    clearShapes() %>% 
    addCircles(lng = ~selectedTotal()$long, lat = ~selectedTotal()$lat, 
weight = 1, fillOpacity = 0.5, color = "darkorange", 
      radius = ~Total.Funds*500, popup = state_popup1 

    ) 
}) 

# Cash Funds 
selectedCash <- reactive({ 
tmp1 <- projects.df[!is.na(projects.df$Project),] 
tmp1[tmp1$Project == input$cashInput, ] 
}) 
observe({ 
state_popup2 <- paste0("<strong>Country: </strong>", 
         selectedCash()$name, 
         "<br><strong>Project: </strong>", 
         selectedCash()$Project, 
         "<br><strong>Client Cash: </strong>", 
         selectedCash()$Client.Cash) 

leafletProxy("map", data = selectedCash()) %>% 
    clearShapes() %>% 
    addCircles(lng = ~selectedCash()$long, lat = ~selectedCash()$lat, weight = 
1, fillOpacity = 0.5, color = "darkred", 
      radius = ~Client.Cash*500, popup = state_popup2) 
}) 

# Total Client 
selectedClient <- reactive({ 
tmp2 <- projects.df[!is.na(projects.df$Project),] 
tmp2[tmp2$Project == input$clientInput, ] 
}) 
observe({ 
state_popup3 <- paste0("<strong>Country: </strong>", 
         selectedClient()$name, 
         "<br><strong>Project: </strong>", 
         selectedClient()$Project, 
         "<br><strong>Total Client: </strong>", 
         selectedClient()$Total.Client) 

leafletProxy("map", data = selectedClient()) %>% 
    clearShapes() %>% 
    addCircles(lng = ~selectedClient()$long, lat = ~selectedClient()$lat, 
weight = 1, fillOpacity = 0.5, color = "darkgreen", 
      radius = ~Total.Client*500, popup = state_popup3) 
}) 

# Indicator 
selectedIndicator <- reactive({ 
tmp5 <- projects.df[!is.na(projects.df$Project),] 
tmp5[tmp5$Total.Funds == input$indicatorInput | tmp5$Client.Cash == 
input$indicatorInput | tmp5$Total.Client == input$indicatorInput, ] 
}) 
observe({ 
state_popup5 <- paste0("<strong>Country: </strong>", 
         selectedIndicator()$name, 
         "<br><strong>Project: </strong>", 
         selectedIndicator()$Project, 
         "<br><strong> Total Funds: </strong>", 
         selectedIndicator()$Total.Funds, 
         "<br><strong>Client Cash: </strong>", 
         selectedIndicator()$Client.Cash, 
         "<br><strong>Total Client: </strong>", 
         selectedIndicator()$Total.Client 
) 

leafletProxy("map", data = selectedIndicator()) %>% 
    clearShapes() %>% 
    addCircles(lng = ~selectedIndicator()$long, lat = 
~selectedIndicator()$lat, weight = 1, fillOpacity = 0.5, color = 
"darkorange", 
      radius = ~Total.Client*500, popup = state_popup5)*** 


}) 

}) 

shinyApp(ui = ui, server = server) 

回答

1

有R社會的幫助下解決。

最後一個過濾器將使用此代碼。

# Indicator 
selectedIndicator <- reactive({switch(input$indicatorInput, 
           "Total Funds " = projects.df$Total.Funds, 
           "Client Cash" = projects.df$Client.Cash, 
           "Total Client" = projects.df$Total.Client) 
}) 

observe({ 
state_popup5 <- paste0("<strong>Country: </strong>", 
         projects.df$name, 
         "<br><strong>Project: </strong>", 
         projects.df$Project, 
         "<br><strong> Total Funds: </strong>", 
         projects.df$Total.Funds, 
         "<br><strong>Client Cash: </strong>", 
         projects.df$Client.Cash, 
         "<br><strong>Total Client: </strong>", 
         projects.df$Total.Client 
) 

leafletProxy("map", data = projects.df) %>% 
    clearShapes() %>% 
    addCircles(lng = projects.df$long, lat = 
       projects.df$lat, weight = 1, fillOpacity = 0.5, color = 
       "darkorange", 
      radius = ~selectedIndicator()*500, popup = state_popup5) 
}) 

結果:

enter image description here