在Shiny中的列表中返回plotly对象

时间:2018-01-31 21:46:00

标签: r list shiny plotly

我有一个闪亮的应用程序,其中自定义函数执行数据操作并返回数据框和图形图的组合。但是,让我使用mtcars创建一个示例来说明问题。

自定义函数返回一个包含plotly对象和另一个变量的列表。

get_plot <- function(x_var)
{

  p <- plot_ly() %>%
  add_lines(data = mtcars, x = ~x_var, y = ~mpg, mode = "lines", line = list(width = 2), name = "Original") %>% layout(hovermode = 'compare') %>%
  layout(  xaxis = list(title = print('x_var'), gridcolor = "#bfbfbf", domain = c(0, 0.98)),
           yaxis = list(title = "MPG", gridcolor = "#bfbfbf"))
  p <- plotly_build(p)

  a <- 1+1
  return(list(p,a))
}

闪亮代码:

source("get_plot.R")

library(shiny)

ui <- fluidPage(

   titlePanel("Example"),

   sidebarLayout(
      sidebarPanel(
         selectInput("x_var",
                     "Select X Axis variable",
                     c("hp","dist","drat","wt","disp","qsec","mpg"))
      ),

      mainPanel(
         plotlyOutput("distPlot")
      )
   )
)

server <- function(input, output) {

   output$distPlot <- renderPlotly({

          get_plot(input$x_var)[1]
   })
}

# Run the application 
shinyApp(ui = ui, server = server)

如果您运行此应用,则会收到以下错误:

Error: no applicable method for 'ggplotly' applied to an object of class "list"

我明白这意味着什么,但我想问一下是否有办法以任何其他方式将一个情节对象作为列表的一部分返回。在我原来的闪亮应用程序中,自定义函数执行大量数据处理,之后它返回列表中的那些数据框和plotly对象。我无法访问它,现在我通过制作相同功能的副本并让它只返回绘图对象来解决问题。显然不是最有效的。

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您所要做的就是使用双括号,因为您要为列表编制索引:

  output$distPlot <- renderPlotly({
    get_plot(input$x_var)[[1]]
  })

希望这有帮助!