在下面的示例中,我生成了一个带有可点击图标的可反应表,该图标减少了相应的“Own”列。这是使用 updateReactable() 完成的。
这工作得很好,但是当表格变大时,updateReactable() 会重新渲染整个表格,因此这意味着用户必须等待表格渲染才能再次单击图标。
有没有办法只更新单个单元格的值而不必每次都渲染整个表格?
我最初想在每个单元格中嵌入一个 numericInput,但发现没有方法可以通过 reactable 做到这一点。我知道 dataTable 有一个选项可以手动输入单元格,但我不喜欢这些表格的美感。
library(shiny)
library(reactable)
library(htmltools)
master_crunch_stats <- data.frame(player_id = paste0("C",seq(1:5)), Own = rep(1,5)) %>%
mutate(Own_down = as.character(icon("minus-circle"))
)
ui <- fluidPage(
div(style = "display: none;", icon("refresh")),
tags$head(
tags$style(".fa-minus-circle {color:#ff6347}")
),
reactableOutput("crunch_stats")
)
server <- function(input, output, session) {
output$crunch_stats <- renderReactable({
reactable(
master_crunch_stats,
fullWidth = FALSE,
columns = list(
Own = colDef(format = colFormat(percent = TRUE, digits = 0),
width = 50, align = "center"),
Own_down = colDef(html = TRUE, name = "", align = "right",
cell = function(value, index) {
sprintf('<a href="#" id=%s onclick = "Shiny.setInputValue(%s, Date.now()+$(this).attr(%s));" > %s </a>', master_crunch_stats[index, "player_id"], "'exposure_down'", "'id'", value)
})
)
)
})
observeEvent(input$exposure_down,{
clicked_id <- paste0("C",unlist(strsplit(input$exposure_down, "C"))[2])
cruncher_selections <- getReactableState("crunch_stats", "selected")
master_crunch_stats$Own[master_crunch_stats$player_id == clicked_id] <<-
max(master_crunch_stats$Own[master_crunch_stats$player_id == clicked_id] - 0.1, 0)
updateReactable("crunch_stats",
master_crunch_stats,
selected = cruncher_selections)
})
}
shinyApp(ui = ui, server = server)