获取要在动态生成的tabSet RShiny中显示的图

时间:2017-06-26 05:35:37

标签: r tabs shiny

我有以下(简化)Shiny app。 我试图在顶部表格中生成与所选行一样多的选项卡,每个选项卡上显示一个图表。我无法让图表显示Error in as.vector: cannot coerce type 'closure' to vector of type 'character'或后续lapply中的某个地方do.call

library(shiny)
library(DT)

UI包含一个表格和空间,用于我试图在那里显示的标签:

ui <- fluidPage(

  titlePanel("Test"),
  mainPanel(
    fluidRow(
      column(12,DT::dataTableOutput(outputId = 'tableCurrencies'))
    ),
    fluidRow(
      uiOutput("selectedTabs")
    )
  )
)

server包括用于捕获所选行的反应函数。

server <- function(input,output){
  output$tableCurrencies <-   DT::renderDataTable({datatable(data.frame(a=rnorm(10),b=rnorm(10),c=rnorm(10)))})

  origTable_selected <- reactive({
    ids <- input$tableCurrencies_rows_selected
    return(ids)
  })
  output$selectedTabs <- renderUI({
    myTabs <- lapply(origTable_selected(),function(i) {

      a <- renderPlot({hist(rnorm(50))})
      return(tabPanel(i,plotOutput(a)))
    })
    return(do.call(tabsetPanel,myTabs))
  })
}
shinyApp(ui = ui, server = server)

欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

您的代码存在的问题是您使用

# context server/rederUI
plot = renderPlot({hist(rnorm(50)})
...
plotOutput(plot) 

检查文档,您会发现这是不正确的用法

  

plotOutput( outputId ,...)

     

outputId :输出变量以从中读取绘图/图像。

您实际上已将类shiny.render.function的对象传递给输出函数。但是,唯一有效的值是(id)字符串。我很惊讶,因为很多人都有这个问题,所以仍然没有闪亮的错误。

这是一个工作版本。您必须为每个图分配一个新的output广告位。

library(shiny)
library(DT)

ui <- fluidPage(

  titlePanel("Test"),
  mainPanel(
    fluidRow(
      column(12, DT::dataTableOutput(outputId = 'tableCurrencies'))
    ),
    fluidRow(
      uiOutput("selectedTabs")
    )
  )
)

server <- function(input, output){
  output$tableCurrencies <- DT::renderDataTable({datatable(data.frame(
    a = rnorm(10), b = rnorm(10), c = rnorm(10)))})

  origTable_selected <- reactive({
    ids <- input$tableCurrencies_rows_selected
    return(ids)
  })
  output$selectedTabs <- renderUI({
    print(origTable_selected())
    myTabs <- lapply(origTable_selected(), function(i) {
      outname <- paste0("plot-", i)                        # this
      output[[outname]] <- renderPlot({hist(rnorm(50))})   # was
      return(tabPanel(i, plotOutput(outname)))             # wrong
    })
    return(do.call(tabsetPanel,myTabs))
  })
}
shinyApp(ui = ui, server = server)