为什么我的过滤表中行的可反应索引是错误的?

问题描述 投票:0回答:1

我使用了可反应的选项来选择行。但是在过滤可反应之后,从 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)

r shiny reactable
1个回答
1
投票

一种可能性:将过滤后的数据放入

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)
© www.soinside.com 2019 - 2024. All rights reserved.