R: Удалено n строк, содержащих пропущенные значения (geom_path) - PullRequest
0 голосов
/ 07 ноября 2019

Я получаю предупреждение (Предупреждение: удалены 2 строки, содержащие пропущенные значения (geom_path).) , которые я не хочу иметь для следующего кода:

library(shiny)
library(ggplot2)
library(scales)


ui <- navbarPage("Test",
                 tabPanel("Test_2",
                          fluidPage(
                            fluidRow(
                              column(width = 12, plotOutput("plot", width = 1200, height = 600))
                            ),
                            fluidRow(
                              column(width = 12, sliderInput("slider",
                                                            label = "Range [h]",
                                                            min = as.POSIXct("2019-11-01 00:00"),
                                                            max = as.POSIXct("2019-11-01 07:00"),
                                                            value = c(as.POSIXct("2019-11-01 00:00"),as.POSIXct("2019-11-01 07:00"))))
                            ))))

server <- function(input, output, session) {

  df <- data.frame("x" = c(as.POSIXct("2019-11-01 00:00"),as.POSIXct("2019-11-01 01:00"),
                           as.POSIXct("2019-11-01 02:00"),as.POSIXct("2019-11-01 03:00"),
                           as.POSIXct("2019-11-01 04:00"),as.POSIXct("2019-11-01 05:00"),
                           as.POSIXct("2019-11-01 06:00"),as.POSIXct("2019-11-01 07:00")), 
                   "y" = c(0,1,2,3,4,5,6,7))

  observe({
    len_date_list <- length(df$x)

    min_merge_datetime <- df$x[1]
    max_merge_datetime <- df$x[len_date_list]

    updateSliderInput(session, "slider",
                      min = as.POSIXct(min_merge_datetime),
                      max = as.POSIXct(max_merge_datetime),
                      timeFormat = "%Y-%m-%d %H:%M")
  })

  output$plot <- renderPlot({

    in_slider_1 <- input$slider[1]
    in_slider_2 <- input$slider[2]

        ggplot(data=df, aes(x, y, group = 1)) +
        theme_bw() +
        geom_line(color="black", stat="identity") +
        # geom_point() +
        scale_x_datetime(labels = date_format("%m-%d %H:%M"),
                         limits = c(
                         as.POSIXct(in_slider_1),
                         as.POSIXct(in_slider_2)))
    })
}

shinyApp(server = server, ui = ui)

Кажется, это общая проблема с «пропущенными значениями», потому что я нашел много похожих вопросов. В этом вопросе объясняется, что это должен быть диапазон оси. Так что в моем случае я уверен, что это из-за ограничений в scale_x_datetime.

    scale_x_datetime(labels = date_format("%m-%d %H:%M"),
                     limits = c(
                     as.POSIXct(in_slider_1),
                     as.POSIXct(in_slider_2)))

Но я не нашел ответа на вопрос, когда используется scale_x_datetime, as.POSIXct и слайдер.

Кстати: если я закомментирую "geom_point", я получу еще одно подобное предупреждение.

1 Ответ

1 голос
/ 07 ноября 2019

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

df %>% filter(between(x, in_slider_1, in_slider_2))

, что, кажется, устраняет проблему для меняПожалуйста, проверьте. Просто упомяну, что у меня были некоторые проблемы с часовыми поясами.

Полный код ниже:

library(shiny)
library(ggplot2)
library(scales)


ui <- navbarPage("Test",
                 tabPanel("Test_2",
                          fluidPage(
                            fluidRow(
                              column(width = 12, plotOutput("plot", width = 1200, height = 600))
                            ),
                            fluidRow(
                              column(width = 12, sliderInput("slider",
                                                            label = "Range [h]",
                                                            min = as.POSIXct("2019-11-01 00:00"),
                                                            max = as.POSIXct("2019-11-01 07:00"),
                                                            value = c(as.POSIXct("2019-11-01 00:00"),as.POSIXct("2019-11-01 07:00"))))
                            ))))

server <- function(input, output, session) {

  df <- data.frame("x" = c(as.POSIXct("2019-11-01 00:00"),as.POSIXct("2019-11-01 01:00"),
                           as.POSIXct("2019-11-01 02:00"),as.POSIXct("2019-11-01 03:00"),
                           as.POSIXct("2019-11-01 04:00"),as.POSIXct("2019-11-01 05:00"),
                           as.POSIXct("2019-11-01 06:00"),as.POSIXct("2019-11-01 07:00")), 
                   "y" = c(0,1,2,3,4,5,6,7))

  observe({
    len_date_list <- length(df$x)

    min_merge_datetime <- df$x[1]
    max_merge_datetime <- df$x[len_date_list]

    updateSliderInput(session, "slider",
                      min = as.POSIXct(min_merge_datetime),
                      max = as.POSIXct(max_merge_datetime),
                      timeFormat = "%Y-%m-%d %H:%M")
  })

  output$plot <- renderPlot({

    in_slider_1 <- input$slider[1]
    in_slider_2 <- input$slider[2]

        ggplot(data=df %>% filter(between(x, in_slider_1, in_slider_2)), aes(x, y, group = 1)) +
        theme_bw() +
        geom_line(color="black", stat="identity") +
        # geom_point() +
        scale_x_datetime(labels = date_format("%m-%d %H:%M"),
                         limits = c(
                         as.POSIXct(in_slider_1),
                         as.POSIXct(in_slider_2)))
    })
}

shinyApp(server = server, ui = ui)

Похоже, что теперь вы можете полностью удалить scale_x_datetime и просто иметь:

        ggplot(data=df %>% filter(between(x, in_slider_1, in_slider_2)), aes(x, y, group = 1)) +
        theme_bw() +
        geom_line(color="black", stat="identity")
...