Shiny应用中renderUI包裹grVizOutput出现closure转字符错误如何解决?
问题原因分析
- 报错的核心原因是UI输出组件与服务端渲染函数的调用逻辑混淆:
grVizOutput()是生成UI组件的函数,它的第一个入参要求为字符类型的输出ID,你传入了属于函数类型(closure)的renderGrViz()执行结果,因此触发了「无法将closure类型强制转换为字符型向量」的报错。 - 要实现图表大小动态调整,只需在
renderUI生成grVizOutput时动态传入width、height参数即可,renderGrViz需要单独绑定到对应输出ID,不能嵌套在grVizOutput中。
修正后可运行代码
以下代码额外增加了滑块控件演示动态调整图表高度的效果,你可以根据需求替换成其他动态参数控制逻辑:
library(shiny) library(DiagrammeR) library(magrittr) ## ui function ui <- shinyUI(fluidPage( fluidRow( column( width = 8, sliderInput("plot_height", "图表高度(px)", min = 300, max = 1000, value = 500), uiOutput('d_output') ) ) ) ) ## server function server <- function(input, output){ # 动态生成grVizOutput组件,传入动态高度参数 output$d_output <- renderUI({ grVizOutput(outputId = "d", height = paste0(input$plot_height, "px")) }) # 单独绑定渲染逻辑到grVizOutput对应的outputId output$d <- renderGrViz({ grViz("digraph boxes_and_circles { # a 'graph' statement graph [overlap = true, fontsize = 10] # several 'node' statements node [shape = box, fontname = Helvetica] A; B; C; D; E; F node [shape = circle, fixedsize = true, width = 0.9] // sets as circles 1; 2; 3; 4; 5; 6; 7; 8 # several 'edge' statements A->1 B->2 B->3 B->4 C->A 1->D E->A 2->4 1->5 1->F E->6 4->6 5->7 6->7 3->8 }") }) } ## run app shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Damien Georges
相关产品推荐
相关产品推荐

