我有以下(简化)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)
欢迎任何帮助。
答案 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)