使用 dplyr 将输入从 Shiny 传递到 plotly 时出现 filter_imp 错误

Error in filter_imp when passing input from Shiny to plotly using dplyr

我正在开发 Shiny 应用程序,但无法理解错误。我在下面创建了一个更简单的可重现示例来捕获问题。最终,我只想将来自 city selection box 的输入传递给 dplyr::filter()。然后我想获取过滤后的数据集并使用 ggplot2 绘制它。最后,我想使用 ggplotly()(来自 plotly 包)将静态图转换为交互式图。下面的代码显示了我是如何构建应用程序的,当 运行 出现两个不同的错误时。

第一个错误是 Warning: Error in filter_impl: Result must have length 9, not 0。长度 9 部分取决于数据,因此对于我较大的应用程序,错误是相同的,但长度为 9721。

我也遇到了这个错误,Warning in origRenderFunc() : Ignoring explicitly provided widget ID "154376613f66f"; Shiny doesn't use them

可能最令人费解的部分是我的应用程序在抛出这两个错误后可以正常工作,并且所有功能似乎都可以正常工作。如果您复制并粘贴下面的代码并 运行 它,应用程序将启动并抛出错误,然后再呈现绘图的输出。

我正在尝试构建一个显示特定 U.S 的独特折线图的应用程序。城市。我希望 UI 可以选择 select 一个州,然后将城市选项过滤到该州内的那些城市。下面的代码生成了所需的界面,但有两个错误。任何人有任何见解?由于该应用程序可以正常工作并且具有我想要的功能,因此很容易抑制错误消息,但我更愿意了解是什么破坏了它并修复它。非常感谢!

library(tidyverse)
library(shiny)
library(plotly)

df <- tibble(
  city = c(rep("city1", 3), rep("city2", 3), rep("city3", 3)),
  state = c(rep("state1", 6), rep("state2", 3)),
  year = c(rep(c(2016, 2017, 2018), 3)),
  dummy_value = c(1, 2, 3, 6, 7, 8, 15, 16, 17)
)

shinyApp(
  ui = fluidPage(
    sidebarLayout(
      sidebarPanel(
        selectInput(inputId = "state", 
                    label = "", 
                    choices = c("state1", "state2")),

        uiOutput("selected_city")

      ),
      mainPanel(
        plotlyOutput("example_plot")
      )
    )
  ),
  server = function(input, output, session) {
    output$selected_city <- renderUI({
      selectInput(inputId = "city", 
                  label = "", 
                  choices = dplyr::pull(
                  unique(df[df$state == input$state, "city"]), city)
                                  )
    })

    output$example_plot <- renderPlotly({
      plot_to_show <- plotly::ggplotly(
        df %>% 
          dplyr::filter(city == input$city) %>% 
          ggplot() +
          geom_point(aes(x = year, y = dummy_value))
      )
    })

  }
)

我不确定第二个警告(我没有收到)但是对于第一个警告,只需使用这个:

output$example_plot <- renderPlotly({

  if(is.null(input$city))
    return()

 plotly::ggplotly(
    df %>% 
      dplyr::filter(city == input$city) %>% 
      ggplot() +
      geom_point(aes(x = year, y = dummy_value))
  )
})