我想在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部分时,我无法使用它。有什么建议吗?感谢
答案 0 :(得分:0)
Reactive用于限制在反应过程中重新运行的内容。 reactive({})
表达式创建类似于input$...
表达式的反应。
即在您的示例中,从data_sub
表达式中提取renderPlotly()
会阻止render df$market
或input$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)
)
})