我使用了可反应的选项来选择行。但是在过滤可反应之后,从 getReactableState("table", "selected") 获得的行号(相应的值)是错误的。我的错误在哪里? 通过单击包含未过滤数据的行,行号是正确的。过滤后我得到错误的值。如何获得过滤表的正确索引?
library(shiny)
library(reactable)
data <- MASS::Cars93[, 1:7]
ui <- fluidPage(
actionButton("select_btn", "Select rows"),
selectInput("filter_type", "Filter type", unique(data$Type), multiple = TRUE),
textInput("row", label = "Selected"),
reactableOutput("table")
)
server <- function(session, input, output) {
selected <- reactive(getReactableState("table", "selected"))
output$table <- renderReactable({
reactable(
data,
filterable = TRUE,
searchable = TRUE,
selection = "single",
)
})
observeEvent(input$select_btn, {
# Select rows
updateReactable("table", selected = c(1, 3, 5))
})
observe({
# Filter data
filtered <- if (length(input$filter_type) > 0) {
data[data$Type %in% input$filter_type, ]
} else {
data
}
updateReactable("table", data = filtered)
})
observe({
updateTextInput(session, "row", value = data$Model[selected()])
})
}
shinyApp(ui, server)
一种可能性:将过滤后的数据放入
reactive()
中,并使用 data_filtered()
更新文本输入。同样,您可以继续使用选定的值。
library(shiny)
library(reactable)
data <- MASS::Cars93[, 1:7]
ui <- fluidPage(
actionButton("select_btn", "Select rows"),
selectInput("filter_type", "Filter type", unique(data$Type), multiple = TRUE),
textInput("row", label = "Selected"),
reactableOutput("table")
)
server <- function(session, input, output) {
rv <- reactiveValues(data = data)
data_filtered <- reactive({
if (length(input$filter_type) > 0) {
rv$data[rv$data$Type %in% input$filter_type,]
} else {
rv$data
}
})
selected <- reactiveValues(j = 0)
currentSelected <-
reactive(getReactableState("table", "selected"))
observeEvent(currentSelected(), priority = 0, {
selected$j <- currentSelected()
})
output$table <- renderReactable({
reactable(
data_filtered(),
filterable = TRUE,
searchable = TRUE,
selection = "single",
)
})
observeEvent(input$select_btn, {
# Select rows
updateReactable("table", selected = c(1, 3, 5))
})
observe({
if (is.null(getReactableState("table", "selected"))) {
updateTextInput(session, "row", value = "")
} else {
updateTextInput(session, "row", value = data_filtered()$Model[selected$j])
}
})
}
shinyApp(ui, server)