gpt4 book ai didi

r - Shiny :更新输入而不触发 react ?

转载 作者:行者123 更新时间:2023-12-03 09:31:47 28 4
gpt4 key购买 nike

是否有可能在不触发 react 器的情况下更新输入?

下面我举一个最小的例子。目的是在不更改主面板中的值的情况下更新 slider 。当 slider 再次更改时,应再次将其转发给相关的 react 器。

问题和基础用例类似于以下问题:R shiny - possible issue with update***Input and reactivityUpdate SelectInput without trigger reactive? .与这些问题类似,在我的用例中有一个依赖于两个输入的响应式(Reactive)。我想根据另一个更新这些输入中的一个,这会导致 react 被计算两次。然而,这两个问题都通过选择性地更新输入来解决这个问题。这在我的用例中是不可能的,因为我想通过更新输入来向用户显示一些信息。

如果没有可能在没有触发响应的情况下更新输入,我会问一个关注我的用例的后续问题。

示例

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)

最佳答案

这是一个刺,虽然感觉使用陈旧数据可能会有副作用。使用以下差异:

 # 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 )
- )
})
}

方法:使用两个新的响应值,一个用于存储 ( saved_bins) 在渲染中使用的数据,一个 ( update) 用于存储该数据是否应该更新。一切取决于 input$bins应该依赖 saved_bins() .通过使用额外的 observeEvent ,除非您明确设置一次性“不要级联”并带有前置 update(FALSE) .

完整代码如下:

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({ 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)
updateSliderInput(session,"bins",value=20)
})
}

shinyApp(ui = ui, server = server)

关于r - Shiny :更新输入而不触发 react ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54560439/

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