我需要一个基于外部函数的动态滑块值。在这里,我使用了runif(...),然而,对于我的真实应用程序,它是一个从互联网上检索价值的网络电话,可能每天更换一次或类似的事情。
global.R
dynamicValue = function(){
runif(1)
}
ui.R
library(shiny)
shinyUI(
fluidPage(
shiny::sidebarPanel(
sliderInput("slider",
"SliderInput",
min = 0,
max = 1,
value = dynamicValue()
)
),
shiny::mainPanel(
)
)
)
现在上面的问题是它只被解析一次,就像页面被刷新一样,值仍然是持久的。
这可以通过以下方式解决:
server.R
library(shiny)
shinyServer(function(input, output, session) {
updateSliderInput(session, "slider", value = dynamicValue() )
})
但是,我有很多绘图,它们渲染一次,然后更新滑块,导致所有内容失效并再次渲染。
有人可以向我解释我如何拥有一个动态滑块,其中的值是根据非确定性函数确定的,每次加载页面时,以及在处理其他任何内容之前都会解析。
答案 0 :(得分:2)
Shiny中一个鲜为人知的特性是静态UI可以是在每个连接上调用的函数。它与Rook兼容的HTTP请求对象(在此可以忽略)需要一个可选参数。
我不记得这是在哪里记录的,但在https://shiny.rstudio.com/reference/shiny/latest/enableBookmarking.html
中提到了它在函数中包装UI,滑块输入在每次加载页面时都会获得一个随机值。
library(shiny)
dynamicValue = function(){
runif(1)
}
ui <- function(request) {
fluidPage(
shiny::sidebarPanel(
sliderInput("slider",
"SliderInput",
min = 0,
max = 1,
value = dynamicValue()
)
),
shiny::mainPanel(
)
)
}
server <- function(input, output, session) {
}
shinyApp(ui, server)