#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-файла? Когда я использовал данные вашего примера и код, который я опубликовал в ответе, это сработало нормально.