gpt4 book ai didi

r - 仅当用户查看输出时才进行 Shiny 计算

转载 作者:行者123 更新时间:2023-12-04 10:08:00 24 4
gpt4 key购买 nike

我在使用Shiny时遇到问题,不知道这是一个错误还是缺少某些东西。我试图找到一种解决方案,但似乎无法在线找到有关此问题的引用。

我有一个应该在按下按钮时运行的功能,但是仅当用户在按下按钮后查看输出时才运行。

这有点怪异,所以我创建了一个最小的示例。我有两个标签。在第一个选项卡中,我选择一个数字(平均值),在第二个选项卡中,我围绕该平均值绘制值。该按钮位于第一个选项卡中,但是只有在转到tab2时,“create.plot”功能才开始运行。为了清楚起见,我创建了这个“loading.div”,该函数在运行时显示。

library(shiny)
library(shinyjs)

create.plot <- function(mean)
{
shinyjs::show('loading.div')
y <- rep(NA,10)
for(i in 1:10)
{
y[i] <- rnorm(1,mean=mean)
Sys.sleep(0.5)
}
shinyjs::hide('loading.div')

return(list(y=y, test='Now it runs from tab1'))
}

server <- function(input, output, session) {

run.function <- eventReactive(input$run,create.plot(input$mean))

output$plot.y <- renderPlot({
plot(run.function()[['y']])
})

output$test <- renderText({
run.function()[['test']]
})
}

ui <- fluidPage(shinyjs::useShinyjs(),
hidden(div(id='loading.div',h3('Loading..'))),
tabsetPanel(

tabPanel('tab1',
numericInput(inputId = 'mean',label='Mean', value=1),
actionButton(inputId = 'run', label='Run')
#,textOutput('test') ## Uncommenting this line, it works.
),

tabPanel('tab2',
plotOutput('plot.y'))
)
)

shinyApp(server=server,ui=ui)

为了确保问题是在tab1时用户没有看输出,我创建了一个测试字符串。如果取消注释该行,则问题已“解决”:该功能在用户单击按钮后直接运行。但是,这仅起作用,因为他正在查看tab1中的输出。

这正成为一个严重的问题,因为我的仪表板上有很多 Shiny 的标签。有带有输入的选项卡和带有输出的选项卡。我希望该功能在单击按钮时运行,但是仅在用户转到“输出”选项卡时才运行。

这是一个已知问题吗?有解决方法吗?

最佳答案

不可见的 react 性元素被认为是“悬浮”的,直到它们被悬浮后才会更新它们的值。默认情况下,只有将它们呈现在屏幕上,才会发生这种情况。

您可以将元素设置为即使不可见也可以通过更改其暂停状态来进行更新。您可以使用outputOptions函数执行此操作。

对于output$test元素,您需要运行

outputOptions(output, "test", suspendWhenHidden = FALSE)

如果您有多个要更新的元素,即使它们不可见,也可以使用
lapply(c("test1", "test2", "test3"),
function(x) outputOptions(output, x, suspendWhenHidden = FALSE)

但是请注意,这意味着将立即执行所有计算。根据计算的大小,这可能会降低应用程序的性能。例如,如果生成了一个绘图,并且需要花费一些时间来渲染,并且只有一小部分用户会查看该绘图,那么谨慎的做法是将其挂起,直到用户请求,以免减慢绘图速度。计算更常用的元素。

编辑

事实证明,“绘图无法预先渲染,因为它们没有宽度和高度。”( https://github.com/rstudio/shiny/issues/1409)。因此,我们必须做一些技巧才能提前绘制图:

我们可以选择图的尺寸,而不必让 shiny自动拟合它。这意味着如果屏幕放大,绘图将不会增长。
library(shiny)
library(shinyjs)

create.plot <- function(mean)
{
print("working.....")
shinyjs::show('loading.div')
y <- rep(NA,10)
for(i in 1:10)
{
y[i] <- rnorm(1,mean=mean)
Sys.sleep(0.5)
}
shinyjs::hide('loading.div')

y
}

server <- function(input, output, session) {

run.function <- eventReactive(input$run,create.plot(input$mean))

output$plot.y <- renderPlot({
plot(run.function())
},
width = 72 * 5,
height = 72 * 3
)

outputOptions(output, "plot.y", suspendWhenHidden = FALSE)
}

ui <- fluidPage(shinyjs::useShinyjs(),
hidden(div(id='loading.div',h3('Loading..'))),
tabsetPanel(

tabPanel('tab1',
numericInput(inputId = 'mean',label='Mean', value=1),
actionButton(inputId = 'run', label='Run')
),

tabPanel('tab2',
plotOutput('plot.y'))
)
)

shinyApp(server=server,ui=ui)

关于r - 仅当用户查看输出时才进行 Shiny 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41622795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com