0

在下面的示例中,我生成了一个带有可点击图标的可反应表,该图标减少了相应的“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)
4

0 回答 0