在闪亮的应用程序中将 plotlyOutput() 移动到服务器端

Move plotlyOutput() to the server side in a shiny app

我有一个闪亮的仪表板,我想在其中使用 .js. 动态调整图形和框的高度问题是,只有当我在 plotlyOutput() 中传递高度参数并给出它是包含高度的 input$GetScreenHeight。但是我得到 object 'input' not found。我可以只将 plotlyOutput() 传递给里面的服务器吗?

jscode <-
  '$(document).on("shiny:connected", function(e) {
  var jsHeight = screen.height;
  Shiny.onInputChange("GetScreenHeight",jsHeight);
});
'

shinyApp(
  ui = dashboardPagePlus(
    header = dashboardHeaderPlus(
    ),
    sidebar = dashboardSidebar(),

    body = dashboardBody(
      tags$script(jscode),
      boxPlus(
        title = "Closable Box with dropdown", 
        closable = TRUE, 
        width = NULL,
        status = "warning", 
        solidHeader = FALSE, 
        collapsible = TRUE,
        plotlyOutput("pl",height = input$GetScreenHeight)
      )
    )

  ),
  server = function(input, output) {

    output$pl <- renderPlotly({
      x    <- faithful[, 2] 
      dat <- data.frame(xx = c(runif(100,20,50),runif(100,40,80),runif(100,0,30)),yy = rep(letters[1:3],each = 100))

      p <- ggplot(dat,aes(x=xx)) +
        geom_histogram(data=subset(dat,yy == 'a'),fill = "red", alpha = 0.2) 

      p <- ggplotly(p)
    })
  }
)

而不是在服务器中移动plotlyOutput,您可以将高度设置为ggplotly:

  ggplotly(p, height = input$GetScreenHeight)

然后在plotlyOutput中设置height = 100%:

plotlyOutput("pl", height = "100%")

也许身高screen.height不是一个好的选择,它太大了。我推荐:

jscode <-
  '$(document).on("shiny:connected", function(e) {
      var jsHeight = 0.4 * document.body.clientWidth; 
      Shiny.onInputChange("GetScreenHeight", jsHeight);
  });
'