尝试创建一个闪亮的应用程序时出错

时间:2016-04-16 07:27:33

标签: r ggplot2 shiny shapefile

我有两个使用形状文件创建的“总人口”和“人口密度”的地图。现在,我正在尝试构建一个闪亮的应用程序,以便我可以从总人口变为人口密度,并且情节应该相应地改变。当我运行代码时,我得到以下错误代码:

警告:错误:ggplot2不知道如何处理类矩阵的数据

以下是我一直在尝试使用的代码:

library(shiny)
library(ggplot2) #Loading necessary libraries


ui <- fluidPage(
  selectInput("mr",
              label="Type of Plot",
              choices=c("Total Population", "Density"),
              selected="Total Population"),
  plotOutput("curv") #Giving an input name and listing out types to choose in the Shiny app
)

server <- function(input, output){

  output$curv <- renderPlot({
    ggplot() +
      geom_polygon(data = final.plot==input$mr, 
                   aes(x = long, y = lat, group = group, fill = Population), 
                   color = "black", size = 0.20) + 
      coord_map()+
      scale_fill_distiller(name="Population", palette = "YlGn")+
      labs(title="Population in Australia")
  }) # Output with the data file and input string to change when input changes.
}

shinyApp(ui = ui, server = server)

非常感谢任何帮助。

更新

我的数据集如下所示:

     id     long       lat order  hole piece
1 Ashmore and Cartier Islands 123.1169 -12.25333     1 FALSE     1
2 Ashmore and Cartier Islands 123.1206 -12.25611     2 FALSE     1
3 Ashmore and Cartier Islands 123.1222 -12.25861     3 FALSE     1
4 Ashmore and Cartier Islands 123.1239 -12.25528     4 FALSE     1
5 Ashmore and Cartier Islands 123.1258 -12.25333     5 FALSE     1
6 Ashmore and Cartier Islands 123.1275 -12.25619     6 FALSE     1
                          group Population Density
1 Ashmore and Cartier Islands.1         NA      NA
2 Ashmore and Cartier Islands.1         NA      NA
3 Ashmore and Cartier Islands.1         NA      NA
4 Ashmore and Cartier Islands.1         NA      NA
5 Ashmore and Cartier Islands.1         NA      NA
6 Ashmore and Cartier Islands.1         NA      NA

这存储在名为“final.plot”的DataFrame中。其他州的人口和密度值。我能够创建一个人口的静态可视化,它看起来像这样:

enter image description here

有一个类似的密度,我正在尝试创建闪亮的应用程序,我可以在这两个之间切换,以便情节相应地改变。现在我尝试了以下代码:

library(shiny)
library(ggplot2) #Loading necessary libraries


ui <- fluidPage(
  selectInput("pop",
              label="Type of Plot",
              choices=c("Population", "Density"),
              selected="Total Population"),
  plotOutput("curv") #Giving an input name and listing out types to choose in the Shiny app
)

server <- function(input, output){

  output$curv <- renderPlot({
    ggplot() +
      geom_polygon(data = final.plot, 
                   aes(x = long, y = lat, group = group, fill = input$pop), 
                   color = "black", size = 0.25) + 
      coord_map()+
      scale_fill_distiller(name="Density", palette = "Spectral")+
      labs(title="Population in Australia")
  })
}
shinyApp(ui = ui, server = server)

但我收到的错误是“提供给连续比例的离散值”。

更新2: 这是我正在使用的数据集的链接: Dataset

1 个答案:

答案 0 :(得分:1)

我已经快速查看了您的代码并提出了一些建议。

1)在提供数据集时,您可以使用函数dput() - 这会写入data.frame的文本表示,回答您问题的人可以简单地粘贴到R.例如:

dput(final.plot)

这将生成文本输出,我可以通过在输出前加final.plot <-来为数据框分配。我重新创建了您的数据框,并使用dput()将其输出为下面的文本。现在其他用户可以迅速切入&amp;粘贴您的数据:

请注意,此数据集有问题 - 请参阅下文

final.plot <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "Ashmore and Cartier Islands", class = "factor"), 
                             long = c(123.1169, 123.1206, 123.1222, 123.1239, 123.1258, 123.1275),
                             lat = c(-12.25333, -12.25611, -12.25861, -12.25528, -12.25333, -12.25619),
                             order = 1:6, hole = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE),
                             piece = c(1L, 1L, 1L, 1L, 1L, 1L),
                             group = structure(c(1L, 1L, 1L, 1L, 1L, 1L),
                             .Label = "Ashmore and Cartier Islands.1", class = "factor"), 
                             Population = c(NA, NA, NA, NA, NA, NA),
                             Density = c(NA, NA, NA, NA, NA, NA)),
                             .Names = c("id", "long", "lat", "order", "hole", "piece", "group", "Population", "Density"),
                             class = "data.frame",
                             row.names = c(NA, -6L))

错误“提供给连续比例的离散值”是由两个问题引起的。

i)您在“人口”和“密度”列中都传递 NA 。下面的数据框为这些列添加了一些(不切实际的)数字,当我单独运行绘图代码时,错误就被删除了。

更正玩具数据集

final.plot <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "Ashmore and Cartier Islands", class = "factor"), 
                             long = c(123.1169, 123.1206, 123.1222, 123.1239, 123.1258, 123.1275),
                             lat = c(-12.25333, -12.25611, -12.25861, -12.25528, -12.25333, -12.25619),
                             order = 1:6, hole = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE),
                             piece = c(1L, 1L, 1L, 1L, 1L, 1L),
                             group = structure(c(1L, 1L, 1L, 1L, 1L, 1L),
                                               .Label = "Ashmore and Cartier Islands.1", class = "factor"), 
                             Population = c(1, 2, 3, 4, 5, 6),
                             Density = c(7, 3, 9, 1, 3, 6)),
                        .Names = c("id", "long", "lat", "order", "hole", "piece", "group", "Population", "Density"),
                        class = "data.frame",
                        row.names = c(NA, -6L))

ii)以交互方式运行时,会导致错误,因为您没有传递适当的数据来填充fill = input$pop。您应该传递final.plot $ Population或final.plot $ Density中的值,具体取决于所选内容。您将传递下拉框的输出 - “Population”或“Density”。这可以使用renderPlot中的switch语句进行更正:

# User input assigns appropriate data to selectedData which can be passed to other functions:
  selectedData <- switch(input$pop, 
                   "Population" = final.plot$Population,
                   "Density" = final.plot$Density)

2)如果您能提供生成您在上面的更新中显示的静态地图的代码,将会很有帮助。在调试Shiny代码时,我发现最简单的方法是首先以非交互方式运行该函数,然后将其合并到Shiny中。我尝试在下面提取您的绘图代码,但它没有产生预期的结果:

library(ggplot2) #Loading necessary libraries
library(mapproj)
library(maps)
ggplot() +
  geom_polygon(data = final.plot, 
               [![aes(x = long, y = lat, group = group, fill = Population), 
               color = "black", size = 0.25) + 
  coord_map()+
  scale_fill_distiller(name="Density", palette = "Spectral")+
  labs(title="Population in Australia")`

enter image description here

3)我不熟悉将数据绘制到R中的地图上,但我相信您的应用需要加载库(mapproj)和库(地图)才能获得所需的结果。以上是以上所有内容:

library(shiny)
library(ggplot2) #Loading necessary libraries
#I added the two lines below:
library(mapproj) 
library(map)

ui <- fluidPage(

  selectInput("pop",
              label="Type of Plot",
              choices=list("Population", "Density"),
              selected="Population"), #NOTE: Total Population changed to Population so that it selects correct default value

  plotOutput("curv") #Giving an input name and listing out types to choose in the Shiny app
)

server <- function(input, output){

#You will probably want to simply import your dataframe final.plot using read.table etc:      
final.plot <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "Ashmore and Cartier Islands", class = "factor"), 
                                   long = c(123.1169, 123.1206, 123.1222, 123.1239, 123.1258, 123.1275),
                                   lat = c(-12.25333, -12.25611, -12.25861, -12.25528, -12.25333, -12.25619),
                                   order = 1:6, hole = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE),
                                   piece = c(1L, 1L, 1L, 1L, 1L, 1L),
                                   group = structure(c(1L, 1L, 1L, 1L, 1L, 1L),
                                                     .Label = "Ashmore and Cartier Islands.1", class = "factor"), 
                                   Population = c(1, 2, 3, 4, 5, 6),
                                   Density = c(7, 3, 9, 1, 3, 6)),
                              .Names = c("id", "long", "lat", "order", "hole", "piece", "group", "Population", "Density"),
                              class = "data.frame",
                              row.names = c(NA, -6L))

  output$curv <- renderPlot({
    #Assign value of selectedData based upon user input:
    selectedData <- switch(input$pop, 
                   "Population" = final.plot$Population,
                   "Density" = final.plot$Density)
    ggplot() +
      geom_polygon(data = final.plot, 
                   aes(x = long, y = lat, group = group, fill =  selectedData), 
                   color = "black", size = 0.25) + 
      coord_map()+
      scale_fill_distiller(name="Density", palette = "Spectral")+
      labs(title="Population in Australia")
  })
}
shinyApp(ui = ui, server = server)

现在您需要做的就是替换您的更新中显示的静态地图的代码,以便在您的闪亮应用中为renderPlot中的错误代码。