gpt4 book ai didi

r - 如何制作一个 Shiny 的重置按钮来重置输入值然后更新数据?

转载 作者:行者123 更新时间:2023-12-04 12:28:55 29 4
gpt4 key购买 nike

我有一个应用程序,它背后有很多数据,还有一套过滤器,用户可以应用这些过滤器对数据进行切片和切块,并获得一系列输出。
由于数据集的大小,每次选择过滤器时,R 处理新过滤的数据时都会出现可以理解的延迟。因此,我实现了一个“更新模型”按钮,该按钮立即应用所有更改(而不是在选择过滤器时单独应用,因为所有滞后加起来)。
我还有一个重置按钮,允许一次完全重置所有过滤器。理想情况下,此按钮的行为是首先将所有输入值更新为其默认值,然后更新数据,以便使用默认值更新所有输出(即相当于手动选择默认值和然后按“更新”按钮)。两个按钮都会增加一个观察到的 react 值并触发数据更新,唯一的区别是当按下重置按钮时,首先重置输入值(理论上),然后增加观察到的 react 值。
然而,当按下复位按钮时,值被复位,但无功输出不会更新。然后必须按下更新按钮(或再次按下重置按钮)才能更新输出。似乎正在发生的是在触发数据更新后重置值,因此不会传递新重置的值。
我尝试在observeEvent 函数中尝试使用优先级值,并将UI 移动到服务器内部的renderUI 函数。我还使用了 bindEvent 来尝试确保数据更新发生在重置之后。
编辑:我不能使用 session$reload() jpdugo17 明智地建议了这一点,因为该应用程序有多个页面,而我只想重置当前页面上的过滤器。
原始应用程序不实用,无法共享,但我使用具有相同逻辑(或缺乏逻辑!)的默认 Shiny 编写了一个问题的稻草人,尽管它缺少像真实应用程序那样具有多个页面的导航栏结构:
应用程序

library(shiny)

ui <- fluidPage(
titlePanel("Old Faithful Geyser Data"),
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30),
actionButton("reset","RESET"),
actionButton("update","UPDATE")
),
mainPanel(
plotOutput("distPlot")
)
)
)

server <- function(input, output,session) {
# Create values to use control the reset/update function
dat <- reactiveValues(bins=30,push_update=0)

# When reset button is pressed, reset the slider value and send a 'push update' signal
observeEvent(input$reset,{
updateSliderInput(session=session,"bins",value=30)
dat$push_update=dat$push_update+1
})

# When update button is pressed, send a 'push update' signal
observeEvent(input$update,{
dat$push_update=dat$push_update+1
})

# When a 'push update' is received update the value used in the model
observeEvent(dat$push_update,{
dat$bins <- input$bins
})

output$distPlot <- renderPlot({
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = dat$bins + 1)

hist(x, breaks = bins, col = 'darkgray', border = 'white')


})

}

shinyApp(ui = ui, server = server)
我希望有一种方法可以实现包括重置和更新按钮。任何帮助将不胜感激。我知道还有许多其他问题涉及重置按钮,但我看不到任何适合此问题的问题。

最佳答案

actionButton()函数有一个内部值,每次按下它都会增加 1。对于重置应用程序,我可以考虑使用 session$reload()如果没有其他标签需要保存。如果只需要重置一部分ui,可以拨打renderUIobserveEvent .
最后,对于更新按钮,我们可以使用输入值,但 isolate因此,触发更新的唯一方法是单击按钮,在这种情况下不更改滑块。

library(shiny)

tab1_ui <- tagList(
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30),
actionButton('reset', 'RESET'),
actionButton("update","UPDATE"),
),
mainPanel(
plotOutput("distPlot")
) )
)

ui <- navbarPage(
title = "Old Faithful Geyser Data",
tabPanel('Tab 1',
uiOutput('tab_1_ui')),
tabPanel('Tab 2',
selectInput('iris_nms', 'Select Column', names(iris)))
)

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

#show the ui at the start of the app.
output$tab_1_ui <- renderUI({
tab1_ui
})

# When reset button is pressed, reset the slider value and send a 'push update' signal
observeEvent(input$reset,{
output$tab_1_ui <- renderUI({
tab1_ui
})
})

# When update button is pressed, send a 'push update' signal
observe({
input$update
input$reset
output$distPlot <- renderPlot({
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = isolate(input$bins[1]))
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})

})


}

shinyApp(ui = ui, server = server)

关于r - 如何制作一个 Shiny 的重置按钮来重置输入值然后更新数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68264013/

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