闪亮:调整UI元素大小时发送调整大小事件

时间:2015-12-04 06:47:23

标签: r shiny

我有一个像

这样的UI元素
fluidRow(column(12, rbokehOutput("linePlots")) )

server.R返回

grid_plot(p1,ncol=3,byrow=TRUE, same_axes=FALSE,width=1500)

这是一个rbokeh人物。当窗口调整大小时,我想返回一个替代的grid_plot,其中ncol的值不同。这有可能在Shiny?

1 个答案:

答案 0 :(得分:4)

是的,这是可能的,您可以在页面Javascript中创建一个Shiny绑定,并在窗口重新调整大小事件上调用R函数。结合此renderUI,您可以将DOM事件绑定到更新UI的R函数。

require(shiny)

shinyApp(
  ui = shinyUI(fluidPage(
    tags$head(
      tags$script(HTML('
        $(window).resize(function(event){
          var w = $(this).width();
          var h = $(this).height();
          var obj = {width: w, height: h};
          Shiny.onInputChange("pltChange", obj);
        });
      '))
    ),
    fluidRow( column(12, uiOutput('ui')) ),
    fluidRow( column(12, textOutput('txt')) )
  )),
  server = shinyServer( function(input,output,session){
    data <- list(x=runif(10),y=runif(10),main="no resize")

    observeEvent(input$pltChange,{
      output$ui <- renderUI({
        plotOutput("linePlots") 
      })

      str <- sprintf('Window height: %d, Window width %d', input$pltChange$height, input$pltChange$width)
      output$txt <- renderText({
        print(str)
      })
      data$main <- str
      output$linePlots <- renderPlot({ plot(data,main=data$main) })
    })
  })
)

此示例创建一个plotOutput并在窗口重新调整大小后填充它。这只是其基本原理的一个例子。由于您没有提供可重现的示例,这可能有助于您了解如何执行此操作。