首页 > 解决方案 > 条形图无法呈现(错误:第一个参数,`data`,必须是数据框或共享数据。[没有可用的堆栈跟踪])

问题描述

我有以下数据:

> data
creadate     employee  
2020-01-11        A A
2020-01-11        A A
2020-01-11        A A   
2020-01-12        A B 
2020-01-12        A B      
2020-01-12        A C      
2020-01-13        A C      
2020-01-14        A C      
2020-01-14        A D      
2020-01-15        A D      

目标是构建一个包含绘图的闪亮应用程序。首先,我想转换数据并添加另一列,该列计算每个时间范围(周、日和日期)-员工组合的出现次数。例如,一周的正常代码是:

data %>% 
  count(Week = week(creadate), employee)

现在,我想让用户可以在这三个选项之间进行选择。我编写了以下完整代码(具体参见#2)

library(shiny)
library(shinyWidgets)
library(tidyverse)
library(DT)
library(plotly)

data <- read.csv("Desktop/adf.csv")

ui <- fluidPage(
  fluidRow(
    column(4, 
           selectInput("timeFrame", "Select time frame", c("month", "week", "day"), multiple = TRUE), 
           dateRangeInput("date", "Select date", start  = "2020-01-01"),
    column(8, 
           plotlyOutput("errorTable")
    )
  )
)

server <- function(input, output, session) {  
  
  #create a reactive object with a NULL starting value
  listofrows <- reactiveValues(data = NULL)
  
  #observe the changes in inputs and update the reactive object 
  observeEvent(c(input$timeFrame, input$date), {
    
    listofrows$data <-  data %>% 
      subset(data, creadate >= input$date[1] & creadate <= input$date[2]) %>% # 1------------------------
      count(input$timeFrame[1] = input$timeFrame[1](creadate), employee) # 2-----------------------------
      

  }, ignoreInit = T,ignoreNULL = TRUE)
   
  
  output$plot <- renderPlotly({
    plot_ly(new_data,
      x = ~ input$timeFrame[1], 
      y = ~ n, 
      color = ~ employee, 
      frame = ~ input$timeFrame[1], 
      type = 'scatter',
      mode = 'markers'
    )
  }
  ) 
 }

shinyApp(ui, server)

但是,此代码不起作用。它说:

Error in : First argument, `data`, must be a data frame or shared data.
  [No stack trace available]```
Do you have any idea?

标签: rshinyplotly

解决方案


有多个问题。

第一个是subset调用,如警告所示:你传递data 了两次——一次是通过第一个显式参数,一次是因为你在subset管道的右侧使用;编码

data %>% 
  subset(data, creadate >= input$date[1] & creadate <= input$date[2]) …

是相同的

subset(data, data, creadate >= input$date[1] & creadate <= input$date[2]) …

要解决此问题,请删除该data参数。此外,由于您使用的是 tidyverse,我建议您坚持使用它,而不是将其与基本功能混合使用;换句话说,使用filter代替subset. 除了一致性之外,该filter函数在面对错误时也更加健壮,并且比subset.

第二个问题是你的count函数调用——你在这里试图做什么并不完全清楚。请查阅count函数的文档以确保您正确使用它。


还有更多的问题。例如,您的绘图代码使用了一个new_data从未定义的变量。你可能想在listofrows$data这里使用。to 的参数plot_ly也是错误的:您不能将变量作为公式传递,您需要正确引用它们(例如 via formula(paste('~', input$timeFrame[1])))。


推荐阅读