在未聚焦的选项卡上,在背景中绘制关于反应值变化的曲线图 [英] Draw ggplot on reactive value change in the background, on nonfocused tabs

查看:0
本文介绍了在未聚焦的选项卡上,在背景中绘制关于反应值变化的曲线图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目标

通过减少等待时间提高用户体验的流动性。

问题

我正在构建一个数据探索仪表板。有两个选项卡:1)(默认选项卡)显示数据表的选项卡,以及2)显示聚集图的选项卡。用户可以通过从侧边栏选择选项来浏览数据(例如,选择您想要显示的点的数量)。表格会在发生更改时进行反应更新,但其他选项卡上的gggraph不会更新--在选择该选项卡之前,才会绘制gggraph

这很烦人,因为数据已经指定,但直到用户单击Plot(绘图)选项卡后流程才开始...因此在大型数据集上浪费时间。

我尝试的

我试着在so和Google上寻找这个问题的提示,但我肯定没有搜索正确,因为这似乎是一个简单的问题。我曾想过实现一个函数,在指定强制抽签的值之后,在瞬间切换到每个非焦点选项卡,但对于如此小的问题,这在UX上是不友好的,而且非常棘手。

MCVE

# Load libraries
library(shiny)
library(shinydashboard)
library(DT)
library(ggplot2)
library(ggthemes)

# Set seed to arbitrary value for reproducibility
set.seed(1)

# Create random dataset of 100K points
test.df <- data.frame(a = 1:100000, b = rnorm(n = 100000, mean= 2, sd=1))

# Create ui
ui <- dashboardPage(dashboardHeader(),
                    dashboardSidebar(
                      sidebarMenu(
                        id = "tabs",
                        # Tab to show table
                        menuItem("Tab 1", tabName = "item1"),
                        # Tab to show plot
                        menuItem("Tab 1", tabName = "item2"),
                        numericInput("numeric", "Length of data", value = 1)
                    )),
                    dashboardBody(
                      tabItems(
                        tabItem("item1", dataTableOutput("table")),
                        tabItem("item2", plotOutput("plot"))
                      )
                    )
                  )

server <- function(input, output) {

  # Get first n rows
  test.df.sample <- reactive({
    head(test.df, n=input$numeric)
  })

  # Render table
  output$table <- DT::renderDataTable({
    datatable(test.df.sample())
  })

  # Render ggplot
  output$plot <-  renderPlot({
    ggplot(test.df.sample()) +
      geom_point(aes(x=a, y=b)) +
      theme_tufte()
  })
}

shinyApp(ui = ui, server = server)

进度更新

更新1-发布日期+2

迫于时间压力,我决定实现一个老套的方法,即调用updateTabItems()来在选项卡之间即时切换。此方法的工作原理是,它会触发Slight来更新每个表项的内容,但会留下不需要的视觉效果(例如,我正在使用Googleway绘制地图,但它会以最大级别缩小,因此您会看到一个条形图,其中世界地图重复了4次,如果它以这种老套的方法更新的话)

推荐答案

我认为您可以使用outputOptions中的suspendWhenHidden选项来获取您正在寻找的行为。然而,这本身还不够,因为要使其工作,用户必须通过转到第二个选项卡来初始化绘图一次。我们可以通过将绘图的高度和宽度设置为非零值来解决此问题,请参阅here

请注意,现在只在表和绘图都完成渲染后才会渲染表,因此需要的时间稍长一些。因此,用户必须等待一次60秒,而不是六次等待10秒。这一新行为的好处是,至少用户可以喝一杯咖啡,并知道当他回来时,一切都准备好了。我希望这是你想要的行为。如果您的目标是按顺序渲染所有内容-我不确定是否可以使用SHINY,恐怕...

下面给出了一个工作示例,希望对您有所帮助!

# Load libraries
library(shiny)
library(shinydashboard)
library(DT)
library(ggplot2)
library(ggthemes)

# Set seed to arbitrary value for reproducibility
set.seed(1)

# Create random dataset of 100K points
test.df <- data.frame(a = 1:100000, b = rnorm(n = 100000, mean= 2, sd=1))

# Create ui
ui <- dashboardPage(dashboardHeader(),
                    dashboardSidebar(
                      sidebarMenu(
                        id = "tabs",
                        # Tab to show table
                        menuItem("Tab 1", tabName = "item1"),
                        # Tab to show plot
                        menuItem("Tab 1", tabName = "item2"),
                        numericInput("numeric", "Length of data", value = 1)
                      )),
                    dashboardBody(
                      tabItems(
                        tabItem("item1", dataTableOutput("table")),
                        tabItem("item2", plotOutput("plot"))
                      )
                    )
)

server <- function(input, output) {

  # Get first n rows
  test.df.sample <- reactive({
    head(test.df, n=input$numeric)
  })

  # Render table
  output$table <- DT::renderDataTable({
    datatable(test.df.sample())
  })

  # Render ggplot
  output$plot <-  renderPlot({
    ggplot(test.df.sample()) +
      geom_point(aes(x=a, y=b))
    }, height = 450, width = 800)
  outputOptions(output, "plot", suspendWhenHidden = FALSE)
}

shinyApp(ui = ui, server = server)

这篇关于在未聚焦的选项卡上,在背景中绘制关于反应值变化的曲线图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆