Я пишу приложение, которое позволяет пользователю выбирать диапазон дат, и график соответственно изменится. Однако у меня возникли проблемы с функцией filter(). Если я жестко закодирую даты, то есть y >= '11.06.2024' и y <= '13.06.2024', приложение будет работать нормально. Однако, когда я пытаюсь сделать фильтр реактивным с помощью input$data_range, график оказывается пустым. Я попытался обернуть столбец фрейма данных и ввод в as.Date, но мой график по-прежнему отображается пустым.
library(shiny)
library(ggplot2)
library(dplyr)
ui <- fluidPage(
dateRangeInput('date_range', 'Pick Range',
start = '2024-06-11',
end = '2024-06-13',
min = '2024-06-11',
max = '2024-06-15'),
actionButton('run', 'Run'),
plotOutput('plot')
)
server <- function(input,output){
data_input <- structure(list(length = 0:4, sec = c("00:00.0", "00:01.0", "00:02.0", "00:03.0", "00:04.0"), time = c(30L, 40L, 50L, 60L, 70L), colors = c(5L, 5L, 5L, 5L, 5L), y = c("6/11/2024", "6/12/2024", "6/13/2024", "6/14/2024", "6/15/2024")), row.names = c(NA, 5L), class = "data.frame")
data_filtered <- eventReactive(input$run,
filter(data_input, as.Date(y) >= as.Date(input$date_range[1]) & as.Date(y) <= as.Date(input$date_range[2]))
)
output$plot <- renderPlot(
ggplot(data_filtered(), aes(x = y, y = time))+geom_point()
)
}
shinyApp(ui = ui, server = server)
@stefan, спасибо, это сработало! Не уверен, что это будет относиться к новому вопросу, но если бы я хотел, чтобы минимальное и максимальное значения в dateRangeInput зависели от минимальных и максимальных дат моего набора данных, понадобится ли мне updateateRangeInput?
Ага. В этом случае updatedateRangeInput — это то, что вам нужно.





Я исправил ваш код, и теперь он работает:
library(shiny)
library(ggplot2)
library(dplyr)
ui <- fluidPage(
dateRangeInput('date_range', 'Pick Range',
start = '2024-06-11',
end = '2024-06-13',
min = '2024-06-11',
max = '2024-06-15'),
actionButton('run', 'Run'),
plotOutput('plot')
)
server <- function(input,output){
data_input <- structure(list(length = 0:4, sec = c("00:00.0", "00:01.0", "00:02.0", "00:03.0", "00:04.0"), time = c(30L, 40L, 50L, 60L, 70L), colors = c(5L, 5L, 5L, 5L, 5L), y = c("2024-6-11", "2024-6-12", "2024-6-13", "2024-6-14", "2024-6-15")), row.names = c(NA, 5L), class = "data.frame")
data_filtered <- eventReactive(input$run,
filter(data_input, lubridate::ymd(y) >= input$date_range[1] & lubridate::ymd(y) <= input$date_range[2])
)
output$plot <- renderPlot(
ggplot(data_filtered(), aes(x = y, y = time))+geom_point()
)
}
shinyApp(ui = ui, server = server)
Формат даты в столбце Y был неправильным, из-за чего фильтрация ваших данных была невозможна. Я переформатировал его, чтобы он был совместим с форматом yyyy-mm-dddateRangeInput(), используя функцию ymd() Lubridate.
Спасибо за ваше решение, оно работает идеально! Если вместо этого столбец Y выглядит как мм-дд-гггг чч-мм-сс, рекомендовали бы вы разделить его на два столбца по дате и времени? Или другой метод?
Я рад, что решение работает. Если столбец Y имеет формат mm-dd-yyyy hh-mm-ss, вам следует использовать функцию mdy_hms() из пакета lubridate, чтобы проанализировать его в объект datetime. Для получения более подробной информации ознакомьтесь с lubridate документацией lubridate.tidyverse.org
По какой-то причине, когда я ввожу те же данные, что и в формате .csv, я получаю сообщение об ошибке, сообщающее, что не удалось проанализировать все форматы, форматы не найдены. Есть идеи, почему это происходит, ведь данные одни и те же? data_input <- read.csv('Testy.csv') вместо data_input <- structure(list(length = 0:4, sec = c("00:00.0", "00:01.0", "00:02.0", "00:03.0", "00:04.0"), time = c(30L, 40L, 50L, 60L, 70L), colors = c(5L, 5L, 5L, 5L, 5L), y = c("2024-6-11", "2024-6-12", "2024-6-13", "2024-6-14", "2024-6-15")), row.names = c(NA, 5L), class = "data.frame")
Прочитав данные в формате CSV, попробуйте преобразовать их в фрейм данных или в тиббл с помощью as.data.frame() или tidyverse::tibble() и посмотрите, работает ли это.
Проблема в том, что столбец
yвdate_inputне является правильной датой в стандартном формате. Преобразуйте этот столбец в дату, используя, например.date_input <- date_input |> mutate(y = lubridate::mdy(y))и ваше приложение работает нормально.