确保 Shiny 图表仅在 shinyMobile f7Tab 中加载一次
Ensure Shiny graphs only load once in shinyMobile f7Tab
我正在使用很棒的 shinyMobile 包来创建移动应用程序。它有 4 个选项卡 (f7Tab()),包括一个我加载所有图表的仪表板选项卡。这个想法是在用户切换到选项卡时加载图表,这样他们就不会减慢初始应用程序加载速度,而且除非触发输入,否则只加载一次图表。
这是我的服务器代码示例(有多个这样的图):
# Reactively render timeseries graph
observe({
# Check which tab is opened (tab label should be 'Dashboard')
if (reactiveVal(input$mainTabs)() == 'Dashboard') {
output$tseriesGraph <- renderPlotly({
tseries_basic(input$tseriesVar)
})
}
})
和对应的UI代码:
# Timeseries plots
f7AccordionItem(
id='tseriesAccord',
title='Timeseries of individual variables',
# Choose var to plot
f7Select(
'tseriesVar',
'Choose variable to plot:',
selected=chosen_vars[1],
choices=chosen_vars
),
br(),
withSpinner(plotlyOutput("tseriesGraph",
height='350px')
)
)
就目前而言,每次用户切换回“仪表板”选项卡时,服务器都会重新加载所有图表,即使它们之前已加载过也是如此。如何防止 Shiny 不必要地重新加载这些图表?
(另外,出于好奇,当加载 id=tseriesAccord 的 f7AccordionItem 时,是否有任何方法可以加载图表?似乎不是此函数的 id 参数。)
非常感谢!
我最终找到了解决方法:使用 f7Accordion id 来确定图表是否应该加载。所以甚至不需要使用代码来检查我的仪表板是否打开。我需要使用 'state' 对象,它显示为 TRUE 或 FALSE,具体取决于 f7Accordion 下的 f7AccordionItem 是否打开。
示例:
# Server
observe(if (input$spagBasicAccord$state) {
output$spagBasicGraph <- renderPlotly({
spag_basic(input$spagBasicVar)
})
})
# UI
# Basic spaghetti graph
f7Accordion(
id='spagBasicAccord',
f7AccordionItem(
title='Basic spaghetti graph',
f7Select(
'spagBasicVar',
'Choose variable to plot:',
selected=chosen_vars[1],
choices=chosen_vars
),
br(),
withSpinner(plotlyOutput("spagBasicGraph",
height='350px')
)
)
)
我正在使用很棒的 shinyMobile 包来创建移动应用程序。它有 4 个选项卡 (f7Tab()),包括一个我加载所有图表的仪表板选项卡。这个想法是在用户切换到选项卡时加载图表,这样他们就不会减慢初始应用程序加载速度,而且除非触发输入,否则只加载一次图表。
这是我的服务器代码示例(有多个这样的图):
# Reactively render timeseries graph
observe({
# Check which tab is opened (tab label should be 'Dashboard')
if (reactiveVal(input$mainTabs)() == 'Dashboard') {
output$tseriesGraph <- renderPlotly({
tseries_basic(input$tseriesVar)
})
}
})
和对应的UI代码:
# Timeseries plots
f7AccordionItem(
id='tseriesAccord',
title='Timeseries of individual variables',
# Choose var to plot
f7Select(
'tseriesVar',
'Choose variable to plot:',
selected=chosen_vars[1],
choices=chosen_vars
),
br(),
withSpinner(plotlyOutput("tseriesGraph",
height='350px')
)
)
就目前而言,每次用户切换回“仪表板”选项卡时,服务器都会重新加载所有图表,即使它们之前已加载过也是如此。如何防止 Shiny 不必要地重新加载这些图表?
(另外,出于好奇,当加载 id=tseriesAccord 的 f7AccordionItem 时,是否有任何方法可以加载图表?似乎不是此函数的 id 参数。)
非常感谢!
我最终找到了解决方法:使用 f7Accordion id 来确定图表是否应该加载。所以甚至不需要使用代码来检查我的仪表板是否打开。我需要使用 'state' 对象,它显示为 TRUE 或 FALSE,具体取决于 f7Accordion 下的 f7AccordionItem 是否打开。
示例:
# Server
observe(if (input$spagBasicAccord$state) {
output$spagBasicGraph <- renderPlotly({
spag_basic(input$spagBasicVar)
})
})
# UI
# Basic spaghetti graph
f7Accordion(
id='spagBasicAccord',
f7AccordionItem(
title='Basic spaghetti graph',
f7Select(
'spagBasicVar',
'Choose variable to plot:',
selected=chosen_vars[1],
choices=chosen_vars
),
br(),
withSpinner(plotlyOutput("spagBasicGraph",
height='350px')
)
)
)