【问题标题】:Wrapping grVizOutput in renderUi/uiOutput in shiny app在闪亮的应用程序中将 grVizOutput 包装在 renderUi/uiOutput 中
【发布时间】:2021-11-21 13:59:07
【问题描述】:

为了能够调整使用DiagrammeR 包生成的图形输出的大小(已在此处解释:https://github.com/rich-iannone/DiagrammeR/issues/93),我需要将grVizOutput 封装在服务器中的renderUI 中并通过以下方式调用它 uiOutput 在用户界面中。

这段代码不断返回以下错误:

Error in as.vector: cannot coerce type 'closure' to vector of type 'character'

注意:直接在 UI 中调用 grVizOutput 可以,但不要让我动态调整图表大小。

知道为什么这没有按预期工作吗?

library(shiny)
library(DiagrammeR)
library(magrittr)

##------------------------------------------
## ui function

ui <- shinyUI(fluidPage( 
  fluidRow(
    column(
      width = 8,
      uiOutput('d')
    )
  )
)
)


##------------------------------------------
## server function

server <- function(input, output){

  output$d <- renderUI({
    grVizOutput(
      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)

【问题讨论】:

    标签: r shiny diagrammer


    【解决方案1】:

    您可以使用shinyjqui 调整大小:

    library(shiny)
    library(shinyjqui)
    library(DiagrammeR)
    
    ui <- shinyUI(fluidPage( 
      fluidRow(
        column(
          width = 8,
          jqui_resizable(grVizOutput("grviz"))
        )
      )
    )
    )    
    
    ##------------------------------------------
    ## server function
    
    server <- function(input, output){
      
      output[["grviz"]] <- 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)
    

    【讨论】:

    • 非常感谢!此解决方案甚至在面向模块的闪亮应用程序中也有效! (事实并非如此,我不知道为什么@lz100的解决方案)。
    • 我认为这种解决方案很难让用户将绘图调整为大于他们的屏幕尺寸,特别是对于小屏幕用户来获得大绘图。想象一下你的屏幕是 1000x1000px,你想要一个 2000x2000px 的绘图。使用 jqui 调整 1000px 边缘的大小将非常难以处理。
    【解决方案2】:

    所以你需要另一个output - render 事件。 renderGrViz 不能在 grVizOutput 内部。

    library(shiny)
    library(DiagrammeR)
    library(magrittr)
    
    ##------------------------------------------
    ## ui function
    
    ui <- shinyUI(fluidPage( 
        fluidRow(
            column(
                width = 8,
                uiOutput('d')
            )
        ),
        sliderInput(inputId = "height", label = "Height", min = 0, max = 2000, value = 300, step = 200),
        sliderInput(inputId = "width", label = "Width", min = 0, max = 2000, value = 300, step = 200)
    )
    )
    
    
    ##------------------------------------------
    ## server function
    
    server <- function(input, output){
        
        output$d <- renderUI({
            grVizOutput(
                "gvout", height = input$height, width = input$width
            )
        })
        
        output$gvout <- 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)
    
    

    【讨论】:

    • 非常感谢!这正是我试图做的
    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2016-12-12
    • 2015-08-03
    • 2013-07-08
    • 2023-03-24
    相关资源
    最近更新 更多