错误:第一个参数必须是数据框或共享数据

时间:2017-11-29 08:29:51

标签: r plotly shinydashboard

我想在shinydashboard中创建基于selectorInput的动态图,但是当我想创建图时我得到错误:

  

第一个参数data必须是数据框或共享数据。

当我尝试将数据子集化并将其用作绘图输入时,我的代码的一部分是服务器部分:

data_sub = reactive({
data_sub_temp = df[df$market == input$market_selector,]
return(data_sub_temp)
  })


  output$market_plot <- renderPlotly({
  plot_ly(
  data = data_sub,
  x = ~ created,
  y = ~ pax,
  group_by = ~ type,
  color = ~ type,
  type = "scatter",
  mode = "lines+markers",
  hoverinfo = 'text',
  text = ~ paste('Year:', created,
                 '</br> </br> Clients: ', pax)
  )  
  })

在UI和服务器代码部分之前加载并预处理数据集。当我在UI和服务器部分之前使用数据集子集时,这段代码可以正常工作,当添加data_sub部分时,我无法使用它。有什么建议吗?感谢

2 个答案:

答案 0 :(得分:0)

Reactive用于限制在反应过程中重新运行的内容。 reactive({})表达式创建类似于input$...表达式的反应。

即在您的示例中,从data_sub表达式中提取renderPlotly()会阻止render df$marketinput$market_selector更改时运行renderPlotly,除非您告诉data_sub必须像上面所做的那样做出反应。除非其他data_sub表达式导致renderPlotly()重绘,否则从input$...表达式中隔离renderPlotly()几乎没有意义。有关更好的理解,请参阅Reactive Tutorial

如果您希望保持data_sub被动,则需要使用绘图中的括号表示法来调用它。 I.e data = data_sub()

在R中分配赋值运算符可能也很有用,因为您错误地使用了=运算符。您的代码仍会运行,但最好使用<-运算符data_sub。请参阅Difference between assignment operators in R

最终代码应如下所示:

服务器

data_sub <- reactive({df[df$market == input$market_selector,]})

output$market_plot <- renderPlotly({
  plot_ly(
  data = data_sub(),
  x = ~ created,
  y = ~ pax,
  group_by = ~ type,
  color = ~ type,
  type = "scatter",
  mode = "lines+markers",
  hoverinfo = 'text',
  text = ~ paste('Year:', created,
                 '</br> </br> Clients: ', pax)
  )  
})

答案 1 :(得分:0)

尝试使用data = data_sub()代替data = data_sub

output$market_plot <- renderPlotly({
  plot_ly(
  data = data_sub(),
  x = ~ created,
  y = ~ pax,
  group_by = ~ type,
  color = ~ type,
  type = "scatter",
  mode = "lines+markers",
  hoverinfo = 'text',
  text = ~ paste('Year:', created,
                 '</br> </br> Clients: ', pax)
  )  
  })