1

我正在尝试在我的 Shiny 应用程序rbokehOutput('plot')中使用 ui 和

output$plot <- renderRbokeh({ 
figure() %>%
      ly_hexbin(x,y)
    })

在服务器部分。我希望绘图的大小在某种意义上是动态的,它应该动态调整大小以填充整个绘图窗口。我一直在玩 ui 和服务器部分的heightandwidth参数,但无法使其工作;我也尝试sizing_mode = "stretch_both"在服务器部分使用。当我在没有 Shiny 的 RStudio 中显示绘图时,绘图也不会填满整个绘图窗口,它保持其方形和纵横比。我希望它表现得像一个普通的 R 绘图,即当我放大绘图窗口时,绘图会自动调整大小以填充整个窗口。我找到了这个链接,但它只处理 Python 实现。理想情况下,我希望 Shiny 的高度固定为 500px,宽度根据浏览器的(大小)动态变化。

最小的工作示例:

library(shiny)
library(rbokeh)

ui <- fluidPage(
  titlePanel("Hello Shiny!"),
  sidebarLayout(
    sidebarPanel(
      sliderInput('numpoint', 'Number of points to plot', min = 10, max = 1000, value = 200)
    ),
    mainPanel(
      rbokehOutput('plot', width = "98%", height = "500px")
    )
  )
)

server <- function(input, output) {
  output$plot <- renderRbokeh({
    x <- seq(1, 100, length = input$numpoint)
    y <- rnorm(input$numpoint, sd = 5)

    figure() %>%
      ly_hexbin(x,y)
  })
}

shinyApp(ui, server)

更新的 MWE:

library(shiny)
library(rbokeh)

ui <- fluidPage(
  titlePanel("Hello Shiny!"),
  sidebarLayout(
    sidebarPanel(
      sliderInput('numpoint', 'Number of points to plot', min = 10, max = 1000, value = 200)
    ),
    mainPanel(
      fluidRow(
        column(12,
               rbokehOutput('plot', height = "800px")
               )
        ),
      fluidRow(
        column(12,
               plotOutput('plot1', height = "800px")
               )
      )

    )
  )
)

server <- function(input, output) {
  output$plot <- renderRbokeh({
    x <- seq(1, 100, length = input$numpoint)
    y <- rnorm(input$numpoint, sd = 5)

    figure(width = 1800, height = 800) %>%
      ly_hexbin(x,y)
  })

  output$plot1 <- renderPlot({
    x <- seq(1, 100, length = input$numpoint)
    y <- rnorm(input$numpoint, sd = 5)

    plot(x,y)
  })
}

shinyApp(ui, server)
4

2 回答 2

0

更新我的答案..

我在对 figure() 的调用中添加了宽度和高度,现在绘图会响应地重新调整大小。

library(shiny)
library(rbokeh)

ui <- fluidPage(
    titlePanel("Hello Shiny!"),
    sidebarLayout(
        sidebarPanel(
            sliderInput('numpoint', 'Number of points to plot', min = 10, max = 1000, value = 200)
    ),
    mainPanel(
        rbokehOutput('plot', width = "100%", height = "800px")
        )
    )
)

server <- function(input, output) {
    output$plot <- renderRbokeh({
        x <- seq(1, 100, length = input$numpoint)
        y <- rnorm(input$numpoint, sd = 5)

        figure(width = 1800, height = 800) %>%
            ly_hexbin(x,y)
    })
}

shinyApp(ui, server)

这是你想要的吗?

于 2017-02-16T13:12:05.380 回答
0

在您的 ui 主体内,您可以添加以下代码:

# This will dynamically set the width of the rBokeh plots
tags$head(tags$script('var dimension = [0, 0];
                          $(document).on("shiny:connected", function(e) {
                              dimension[0] = window.innerWidth;
                              dimension[1] = window.innerHeight;
                              Shiny.onInputChange("dimension", dimension);
                          });
                          $(window).resize(function(e) {
                              dimension[0] = window.innerWidth;
                              dimension[1] = window.innerHeight;
                              Shiny.onInputChange("dimension", dimension);
                          });
                          '))

然后您可以将动态大小用作输入对象,例如

figure(width = input$dimension[1], height = input$dimension[2],
于 2019-10-27T21:46:43.580 回答