2016-04-16 6 views
2

У меня есть два картографических графика «Общая нация» и «Плотность населения», созданная с использованием файла формы. Теперь я пытаюсь создать блестящее приложение, чтобы я мог перейти от Total Population to Population Density, и график должен измениться соответствующим образом. Когда я запускал код, я получил следующий код ошибки:Ошибка при попытке создания приложения Shiny

Предупреждение: Ошибка: 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) 

Любая помощь очень ценится.

UPDATE:

Мой набор данных выглядит следующим образом:

 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 

Это хранится в DataFrame под названием "final.plot". Существуют ценности населения и плотности для других государств. Я был в состоянии создать статическую визуализацию населения и это выглядит следующим образом:

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) 

Но я получаю сообщение об ошибке сказав «Discrete Поставляемого значения непрерывной шкалы».

UPDATE 2: Вот ссылка для набора данных я использую: Dataset

+0

Сначала вы можете попытаться создать реактивный набор данных (в зависимости от ввода $ mr), а затем передать его в ggplot. –

+2

этот 'data = final.plot == input $ mr,' возможно, не работает, и это объясняет ваше сообщение об ошибке. Я подозреваю другие проблемы (например, что означает 'final.plot', и что должен делать' mr', но это сложно, если ваш пример не является [воспроизводимым] (http://stackoverflow.com/вопросы/5963269/как к Make-A-пра-р-воспроизводимая-примера/5963610 # 5963610). –

+0

Привет, я отредактировал сообщение. Было бы здорово, если бы вы могли посмотреть на него и прокомментировать его. Благодаря! –

ответ

1

Я имел быстрый взгляд на свой код и есть несколько предложений.

1) При предоставлении ваших наборов данных вы можете использовать функцию dput() - это пишет текстовое представление вашего data.frame, которые люди, отвечая на ваш вопрос, можно просто вставить в R. Например:

dput(final.plot) 

Это приведет к получению текстового вывода, который я могу назначить для фрейма данных путем префикса final.plot <- на выход. Я воссоздал ваш dataframe и использовал dput() для вывода его в виде текста ниже. Теперь другие пользователи могут быстро вырезать & вставить данные:

Примечание Этот набор данных неисправен - см ниже

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)) 

Ошибка «Discrete Поставляемое значение непрерывной шкале» вызывается двумя вопросами.

i) Вы проходите NA в обеих колонках населения и плотности. В приведенной ниже таблице данных добавляются некоторые (нереальные) числа к этим столбцам, и ошибка удаляется, когда я запускаю код построения в отдельности.

Исправленная игрушка Dataset

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 в зависимости от того, что было выбрано. Вместо этого вы выходите из выпадающего списка - «Население» или «Плотность». Это может быть исправлено с помощью переключателя заявление в renderPlot:

# 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. Я попытался извлечь код построения графиков ниже, но это не производит ожидаемые результаты:

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 в вашем блестящем приложении.

+0

Вау! Благодарим вас за подробное объяснение проблемы Graeme! Теперь работает. Мне пришлось изменить fill = selectedData, и это сделало трюк! Спасибо, что нашли время, чтобы показать это мне. –

+0

Я заметил это как ответ. Кроме того, было интересно, могу ли я изменить название легенды в соответствии с выбором? –

+1

Спасибо Арвинду, измените строку 'scale_fill_distiller (name =" Density ", palette =" Spectral ") +' to 'scale_fill_distiller (name = input $ pop, palette =" Spectral ") +' это автоматически изменит легенду фигуры основанный на пользовательском вводе. – Graeme