r - 如何抑制在 lapply 中触发的 Shiny observeEvent
问题描述
我正在寻找关于过度敏感的 R Shiny reactiveValues 对象的一些帮助。提前致谢。
我的目标是开发一个简单的表单,通过在 lapply 中调用 renderUI 返回 3 个闪亮的流体行。每行有两个按钮和一个从 0 开始的值。通过分别单击“加号”或“减号”按钮,该值应增加或减少 1。
当任一按钮被点击时,虽然 observeEvent 一直在触发,正如调用打印更新值时所看到的那样。我在前面放置了一个隔离,但它否定了前端值的更新。
library(shiny)
library(dplyr)
ui <- fluidPage(
uiOutput('oupt_q11')
)
server <- function(input, output, session) {
tbl_vals <- reactiveValues(
pos_1 = 0
, pos_2 = 0
, pos_3 = 0
)
output$oupt_q11 <- renderUI({
lapply(seq_along(1:3), function(x){
# tbl_vals_x <- isolate(as.character(tbl_vals[[paste0('pos_', x)]]))
tbl_vals_x <- as.character(tbl_vals[[paste0('pos_', x)]])
hold_rtrn <- fluidRow(
column(12,
style = 'background-color: #b8c2d1'
, column(3, actionButton(paste0('btn_less_', x), label = ' - '))
, column(3, tbl_vals_x)
, column(3, actionButton(paste0('btn_more_', x), label = ' + '))
))
observeEvent(input[[paste0('btn_less_', x)]], {
pass_value <- as.numeric(tbl_vals[[paste0('pos_', x)]])
tbl_vals[[paste0('pos_', x)]] <- pass_value - 1
print(tbl_vals[[paste0('pos_', x)]])
})
observeEvent(input[[paste0('btn_more_', x)]], {
pass_value <- as.numeric(tbl_vals[[paste0('pos_', x)]])
tbl_vals[[paste0('pos_', x)]] <- pass_value + 1
print(tbl_vals[[paste0('pos_', x)]])
})
return(hold_rtrn)
})
})
}
shinyApp(ui, server)
解决方案
只是把observeEvent()
外面的renderUI
。有用。尝试这个。
library(shiny)
library(dplyr)
ui <- fluidPage(
uiOutput('oupt_q11')
)
server <- function(input, output, session) {
tbl_vals <- reactiveValues(
pos_1 = 0
, pos_2 = 0
, pos_3 = 0
)
output$oupt_q11 <- renderUI({
hold_rtrn <- list()
lapply(seq_along(1:3), function(x){
#tbl_vals_x <- as.character(tbl_vals[[paste0('pos_', x)]])
hold_rtrn[[x]] <<- fluidRow(
column(12,
style = 'background-color: #b8c2d1'
, column(3, actionButton(paste0('btn_less_', x), label = ' - '))
, column(3, as.character(tbl_vals[[paste0('pos_', x)]]))
, column(3, actionButton(paste0('btn_more_', x), label = ' + '))
))
})
hold_rtrn
})
lapply(1:3, function(x) {
observeEvent(input[[paste0('btn_less_', x)]], {
pass_value <- as.numeric(tbl_vals[[paste0('pos_', x)]])
tbl_vals[[paste0('pos_', x)]] <- pass_value - 1
print(tbl_vals[[paste0('pos_', x)]])
})
observeEvent(input[[paste0('btn_more_', x)]], {
pass_value <- as.numeric(tbl_vals[[paste0('pos_', x)]])
tbl_vals[[paste0('pos_', x)]] <- pass_value + 1
print(tbl_vals[[paste0('pos_', x)]])
})
})
}
shinyApp(ui, server)
推荐阅读
- java - 未保留多模块项目中的 Lombok @RequiredArgsConstructor
- java - 使用java检查字符串是否为回文
- node.js - 属性未提交到 MongoDB(MERN 堆栈)
- azure - Azure DevOps Powershell 脚本无法创建 SSL/TLS 安全通道
- java - 日历 / GregorianCalendar 等效 Javascript
- python - 类型变量错误。你们能帮我让我的代码工作吗?
- html - 悬停图像时更改背景颜色
- r - 如何将数据帧从 R 导出到 excel 并用空行分隔它们
- javascript - 使用 Axios Vue JS 访问 JSON 对象内的数组
- python - 为什么当变量变为0时while循环不会停止?(Python)