Создайте реактивный selectInput — flexdashboard с Shiny в Rmarkdown

#r #r-markdown #flexdashboard

#r #r-markdown #flexdashboard

Вопрос:

я использую shiney впервые. Я хочу создать реактивный виджет, содержащий названия городов, представляющих интерес для моего исследования. При выборе городов отображаемый график должен измениться.

Это мой импортированный csv:

 ```{r}
    Data20 = read_delim("SAC55.csv", delim = ",")
    tail(Data20)
```
   `DIAS `    `SANTOAMARO ` ` CACHOEIRA ` `CDA ` `SAUBARA `   SFC
  <date>             <dbl>         <dbl>  <dbl>      <dbl> <dbl>
1 2020-08-10           690           333    466         47   668
2 2020-08-11           695           335    470         47   676
3 2020-08-12           717           350    483         48   687
4 2020-08-13           719           356    500         48   701
5 2020-08-14           736           370    507         49   708
6 2020-08-15           763           377    527         49   713


```{r}
colnames(Data20) <- gsub(" ","",colnames(Data20))

```
DIAS       SANTOAMARO CACHOEIRA   CDA SAUBARA   SFC
  <date>          <dbl>     <dbl> <dbl>   <dbl> <dbl>
1 2020-08-10        690       333   466      47   668
2 2020-08-11        695       335   470      47   676
3 2020-08-12        717       350   483      48   687
4 2020-08-13        719       356   500      48   701
5 2020-08-14        736       370   507      49   708
6 2020-08-15        763       377   527      49   713
  

именно таким образом я пытаюсь создать реактивный selectImput

 Data20 = read_delim("SAC55.csv", delim = ",")
colnames(Data20) <- gsub(" ","",colnames(Data20))
Data20$DIAS = as.Date(Data20$DIAS)



  ```{r}

ui = shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
selectInput(inputId = "Cidades", 
              label = "Cidades",
             choices = c("Santo Amaro" = "SANTOAMARO", "Cachoeira" = "CACHOEIRA", "Cruz das Almas" = "CDA", "Saubara" = "SAUBARA", "SFC" = "SFC"), 
             selected = "SANTOAMARO")),

mainPanel(plotlyOutput("city")))

  ))

server = shinyServer(function(input, output) {

  II <- reactive({
    Data20[ , c("DIAS", input$Cidades)]
     })

output$city = renderPlotly({
   ggplotly(ggplot(data = II(), mapping = aes_string("DIAS", y = input$cidades),  group=1)) 
  geom_line(size = 1, col="pink") 
  geom_point(size = 1, col="red" ) 
  labs(x = "DIAS")   
  labs(y = "CASOS") 
  scale_x_date(NULL, date_labels = "%d, %b", date_breaks = "3 days") 
  scale_y_continuous(limits = c(0, 800), breaks = c(0,10,20,40,60,80,100,120,140,180,160,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600,620,640,660,680,700,720,740,760,780,800,900)) 
  theme(plot.title = element_text(hjust = 0.5)) 
  theme(text=element_text(family=" Arial ", size=9, face="bold")) 
  theme(axis.text.x = element_text(family="Arial", face="bold", size=10, angle=45)) 
 })
})
shinyApp(ui = ui,server = server)
```
  

Хотя виджет с названиями городов появляется, графика формируется. Я пробовал несколько способов решить эту проблему, но безрезультатно.
Если кто-нибудь может мне помочь, я буду очень благодарен.

Ответ №1:

Фелипе — похоже, здесь может произойти несколько вещей.

Если ваше II() reactive выражение заключается в извлечении данных о дате и городе из Data20 , то вы можете захотеть (обратите внимание на жесткие скобки):

 Data20[ , c("DIAS", input$Cidades)] 
  

в противном случае он будет думать, Data20 что это функция.

Кроме того, примерные данные Data20 имеют названия столбцов, такие как «SAUBARA», но selectInput выбранные значения относятся к `SAUBARA» (с обратными отметками и пробелом) — они должны быть одинаковыми.

Наконец, в ggplotly , если вы хотите, чтобы по оси y отображался выбранный город, то вы могли бы попробовать:

aes_string(x = "DIAS", y = input$Cidades, group = 1)

…и ggplotly должен вызываться для ggplot объекта.

 library(shiny)
library(ggplot2)
library(plotly)

ui <- shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "Cidades", 
                  label = "Cidades:",
                  choices = c("Santo Amaro" = "SANTOAMARO", "Cachoeira" = "CACHOEIRA", "Cruz das Almas" = "CDA", "Saubara" = "SAUBARA", "SFC" = "SFC"), 
                  selected = "SANTOAMARO")),
    
    mainPanel(plotlyOutput("city")))
))

server <- shinyServer(function(input, output) {
  
  II <- reactive({ 
    Data20[ , c("DIAS", input$Cidades)]
  })
  
  output$city = renderPlotly({
    ggplotly(ggplot(data = II(), mapping = aes_string(x = "DIAS", y = input$Cidades, group = 1))  
      geom_line(size = 1, col="pink") 
      geom_point(size = 1, col="red" ) 
      labs(x = "DIAS",  tail(129))   
      labs(y = "CASOS") 
      scale_x_date(NULL, date_labels = "%d, %b", date_breaks = "3 days") 
      scale_y_continuous(limits = c(0, 800), breaks = c(0,10,20,40,60,80,100,120,140,180,160,200,220,240,260,280,300,320,340,360,380,400,420,440,460,480,500,520,540,560,580,600,620,640,660,680,700,720,740,760,780,800,900)) 
      theme(plot.title = element_text(hjust = 0.5)) 
      theme(text=element_text(family=" Arial ", size=9, face="bold")) 
      theme(axis.text.x = element_text(family="Arial", face="bold", size=10, angle=45)))
  })
  
})

shinyApp(ui, server)
  

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

1. Привет, Бен, спасибо за ответ. Я желаю, чтобы мое реактивное выражение Date20 указывало город и дату. Я внес предложенные исправления, однако графика не отображается и появляется следующее сообщение об ошибке: Прослушивание 127.0.0.1: 5530 Ошибка в: Не удается подмножество столбцов, которые не существуют. x столбцов DIAS и SANTOAMARO не существуют.

2. Я думаю, это потому, что в вашем csv-файле имена столбцов отличаются от тех, что приведены в вашем примере выше. Имена столбцов должны соответствовать вашим данным. После прочтения вашего csv-файла убедитесь, что в именах ваших столбцов нет пробелов. Вы пробовали мой ответ с вашими тестовыми данными выше, чтобы посмотреть, работает ли он?

3. После вашей строки кода с помощью read_delim вы можете удалить все пробелы для обучения в именах столбцов с помощью: colnames(Data20) <- gsub(" ","",colnames(Data20)) … тогда вам не нужны обратные галочки и пробелы в именах ваших столбцов. Помогает ли это?

4. К сожалению, это не решило проблему, даже применив исправления. На этот раз произошла новая ошибка: Ошибка в aes_string: аргумент отсутствует, значение по умолчанию отсутствует [Трассировка стека недоступна]

5. Вы пробовали мой пример кода, используя предоставленные вами данные примера, а не из вашего csv-файла? Когда я использовал данные вашего примера и код, который я опубликовал в ответе, это сработало нормально.