- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使“observeEvent”不被“updateSelectizeInput”更改触发
在此示例代码中,右侧的数据表“value$data”和“渲染数据表”用于模拟 SQL 数据库,该数据库通过左侧的操作进行更新。
通过在 selectize1(cars) 上选择不同的“cars”,selectize2(HP) 将根据“数据库”上的当前内容进行更新。
当用户更改 selectize2(HP) 时,“observeEvent”将使用所选汽车的新 HP 更新“数据库”。
问题是:当用户更改选定的汽车 (selectize1) 时,updateSelectizeInput 将导致 'observeEvent' 上不必要的触发器和数据库中不必要的更新。
关于如何避免这个问题的任何建议?
library(shiny)
library(tibble)
library(dplyr)
library(shinyjs)
value <- reactiveValues()
dt <- mtcars %>%
rownames_to_column(var = 'cars') %>%
slice_head(n = 5) %>%
select(cars, mpg, hp)
value$data <- dt
ui <- fluidPage(
titlePanel("Example App"),
sidebarLayout(
sidebarPanel(
shinyjs::useShinyjs(),
div(style="display: inline-block;",
selectizeInput("cars", "Cars:",
choices=dt$cars,width = 200)
),
div(style="display: inline-block;",
selectizeInput(
'hp',"hp:",
choices = unique(dt$hp),
width = 200)
),
helpText("You can change cars hp info here"),
div(id='actions','actions:')
),
mainPanel(
dataTableOutput("datatable1")
)
)
)
# Define the server code
server <- function(session,input, output) {
observeEvent(input$cars,{
updateSelectizeInput(session,'hp',selected = value$data$hp[value$data$cars==input$cars])
})
observeEvent(input$hp,{
value$data$hp[value$data$cars==input$cars] <- input$hp
shinyjs::html(
id = 'actions',
add = TRUE,
html = paste0('<br> updated dt table at ', input$cars, 'on ', Sys.time())
)
})
output$datatable1 <- renderDataTable(value$data)
}
# Return a Shiny app object
shinyApp(ui = ui, server = server)
我目前的解决方案 是在“updateSelectizeInput”之前将值保存在 react 值中,并在“hp”的observeEvent内进行比较。
library(shiny)
library(tibble)
library(dplyr)
library(shinyjs)
value <- reactiveValues()
dt <- mtcars %>%
rownames_to_column(var = 'cars') %>%
slice_head(n = 5) %>%
select(cars, mpg, hp)
value$data <- dt
saveValue <- reactiveValues()
saveValue$value <- ''
ui <- fluidPage(
titlePanel("Example App"),
sidebarLayout(
sidebarPanel(
shinyjs::useShinyjs(),
div(style="display: inline-block;",
selectizeInput("cars", "Cars:",
choices=dt$cars,width = 200)
),
div(style="display: inline-block;",
selectizeInput(
'hp',"hp:",
choices = unique(dt$hp),
width = 200)
),
helpText("You can change cars hp info here"),
div(id='actions','actions:')
),
mainPanel(
dataTableOutput("datatable1")
)
)
)
# Define the server code
server <- function(session,input, output) {
observeEvent(input$cars,{
saveValue$value <- value$data$hp[value$data$cars==input$cars]
updateSelectizeInput(session,'hp',selected = value$data$hp[value$data$cars==input$cars])
})
observeEvent(input$hp,ignoreInit = TRUE,{
if(saveValue$value!=input$hp){
value$data$hp[value$data$cars==input$cars] <- input$hp
shinyjs::html(
id = 'actions',
add = TRUE,
html = paste0('<br> updated dt table at ', input$cars, 'on ', Sys.time())
)
}
})
output$datatable1 <- renderDataTable(value$data)
}
# Return a Shiny app object
shinyApp(ui = ui, server = server)
最佳答案
无需将状态保存在 react 值中,您可以直接使用它进行比较。因此,尽管仍然使用 if 语句,但与您当前的解决方案相比,这是一种更直接的方法(如果您正在寻找没有的解决方案,请发表评论)。
这里你有服务器代码而不使用 saveValue
server <- function(session,input, output) {
observeEvent(input$cars,{
updateSelectizeInput(session,'hp',selected = value$data$hp[value$data$cars==input$cars])
})
observeEvent(input$hp,ignoreInit = TRUE,{
checkValue <- value$data$hp[value$data$cars==input$cars]
if(checkValue != input$hp){
value$data$hp[value$data$cars==input$cars] <- input$hp
shinyjs::html(
id = 'actions',
add = TRUE,
html = paste0('<br> updated dt table at ', input$cars, 'on ', Sys.time())
)
}
})
output$datatable1 <- renderDataTable(value$data)
}
关于r - 在 R 中,如何使 'observeEvent' 不会被 'updateSelectizeInput' 的更改触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64937667/
我想使用 react 值来加载控件 selectizeInput 小部件。我可以使用一个简单的 Shiny 应用程序来做到这一点,但是当我尝试在模块中重新组织它时,我似乎无法复制它。 在以下代码中,我
我们 Shiny 的页面有多个 selectizeInput 控件,其中一些控件的下拉框中有很长的列表。因此,初始加载时间非常长,因为它需要为所有 selectizeInput 控件预填充下拉框。 编
我试图将 react 数据传递给 updateSelectizeInput 但出现以下错误: .getReactiveEnvironment()$currentContext() 中的错误: 如果没有
有没有办法将 HTML 标签(例如 h6)用于 updateSelectizeInput(适用于 selectInput,请参阅下面的代码)?在下面的代码中,只需在 updateSelectizeIn
有没有办法将 HTML 标签(例如 h6)用于 updateSelectizeInput(适用于 selectInput,请参阅下面的代码)?在下面的代码中,只需在 updateSelectizeIn
我是 Shiny 的新手,很难弄清楚这一点。我试图在 selectizeInput 中创建一个“全选”按钮,但在将输入从 selectizeInput 传递到 updateSelectizeInput
如何使“observeEvent”不被“updateSelectizeInput”更改触发 在此示例代码中,右侧的数据表“value$data”和“渲染数据表”用于模拟 SQL 数据库,该数据库通过左
我是一名优秀的程序员,十分优秀!