Jul*_*ian 7 r reactive-programming shiny
是否有可能在不触发反应的情况下更新输入?
下面我举了一个最小的例子。目的是在不改变主面板中的值的情况下更新滑块。当滑块再次更改时,应再次将其转发给相关反应。
问题和潜在用例类似于以下问题:R 闪亮 - 更新***输入和反应性和更新 SelectInput可能存在问题而没有触发反应性?. 与这些问题类似,在我的用例中有一个依赖于两个输入的反应。我想根据另一个更新这些输入中的一个,这导致反应性计算两次。然而,这两个问题都通过选择性地更新输入来解决这个问题。这在我的用例中是不可能的,因为我想通过更新输入向用户显示一些信息。
如果没有可能在不触发反应的情况下更新输入,我会问一个关注我的用例的后续问题。
例子
library(shiny)
ui <- fluidPage(
titlePanel("Update Slider - Isolate reaction?"),
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30),
actionButton("set1", "set slider 'bins'$value=20"),
actionButton("set2", "'ISOLATED' set slider 'bins'$value=20 ")
),
mainPanel(
textOutput("sliderValue")
)
)
)
# Define server logic
server <- function(input, output, session) {
output$sliderValue <- renderText(input$bins)
observeEvent(input$set1,{
updateSliderInput(session,"bins",value=20)
})
observeEvent(input$set2,{
## Is there any possibility to update the slider without 'sliderValue' changing?
#isolate does not work
isolate(
updateSliderInput(session,"bins",value=20 )
)
})
}
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
这是一个尝试,尽管感觉使用过时的数据可能会产生副作用。使用以下差异:
# Define server logic
server <- function(input, output, session) {
- output$sliderValue <- renderText(input$bins)
+ output$sliderValue <- renderText({ saved_bins(); })
+ update <- reactiveVal(TRUE)
+ saved_bins <- reactiveVal(30)
+
+ observeEvent(input$bins, {
+ if (update()) saved_bins(input$bins) else update(TRUE)
+ })
observeEvent(input$set1,{
updateSliderInput(session,"bins",value=20)
})
observeEvent(input$set2,{
## Is there any possibility to update the slider without 'sliderValue' changing?
#isolate does not work
+ update(FALSE)
- isolate(
updateSliderInput(session,"bins",value=20 )
- )
})
}
Run Code Online (Sandbox Code Playgroud)
saved_bins
方法:使用两个新的反应值,一个存储 ( ) 在渲染中使用的数据,一个 ( update
) 存储该数据是否应该更新。一切依赖的东西input$bins
都应该依赖saved_bins()
。通过使用附加的observeEvent
,反应性将始终按照最初期望的方式级联,除非您使用前置的 明确设置一次性“不级联” update(FALSE)
。
完整代码如下:
# Define server logic
server <- function(input, output, session) {
- output$sliderValue <- renderText(input$bins)
+ output$sliderValue <- renderText({ saved_bins(); })
+ update <- reactiveVal(TRUE)
+ saved_bins <- reactiveVal(30)
+
+ observeEvent(input$bins, {
+ if (update()) saved_bins(input$bins) else update(TRUE)
+ })
observeEvent(input$set1,{
updateSliderInput(session,"bins",value=20)
})
observeEvent(input$set2,{
## Is there any possibility to update the slider without 'sliderValue' changing?
#isolate does not work
+ update(FALSE)
- isolate(
updateSliderInput(session,"bins",value=20 )
- )
})
}
Run Code Online (Sandbox Code Playgroud)