如何在修改底层数据时跳转到可反应的页面?

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

我正在尝试使用

reactable
包在用户修改
reactable
底层的数据后跳转到特定的行索引。

library(shiny)
library(reactable)
library(dplyr)

ui <- fluidPage(
    selectInput("index", "Index", choices = seq_len(nrow(iris))),
    selectInput("species", "Species", choices = unique(iris$Species)),
    actionButton("go", "Modify"),
    reactableOutput("table")
)

server <- function(input, output, session) {
    # Reactive data
    data <- reactiveValues(
        data = iris |> mutate(Index = row_number())
    )

    # Render reactable
    output$table <- renderReactable({
        reactable(data$data)
    })

    # Update data on button click
    observeEvent(
        input$go,
        {
            # modify the one record
            x <- data$data |>
                filter(Index == input$index) |>
                mutate(Species = input$species)

            # rm from all data
            data$data <- data$data |>
                filter(Index != input$index) |>
                bind_rows(x) |>
                arrange(Index)

            # get index of change
            index <- x |> pull(Index)

            # hop to that approximate page
            updateReactable("table", page = ceiling(index / 10))
        }
    )
}

shinyApp(ui, server)

observeEvent()
成功更新数据,但没有跳转到修改索引的页面。即,如果用户位于第 1 页,但使用
Index == 44
将记录从
setosa
修改为
versicolor
,我想使用
reactable::updateReactable()
跳转到该页面。运行此代码时,看起来它试图在
reactable
输出呈现新数据之前跳转到页面,这就是我假设的问题所在。

r shiny reactable
1个回答
1
投票

问题在于您在页面被新数据替换之前更新了页面。 您可以使用

updateReactable
同时更新数据和页面。 但是您需要在
renderReactable
内部进行隔离,这样您就不会更新两次(这可能是不可预测的)。

library(shiny)
library(reactable)
library(dplyr)

ui <- fluidPage(
    selectInput("index", "Index", choices = seq_len(nrow(iris))),
    selectInput("species", "Species", choices = unique(iris$Species)),
    actionButton("go", "Modify"),
    reactableOutput("table")
)

server <- function(input, output, session) {
    # Reactive data
    data <- reactiveValues(
        data = iris |> mutate(Index = row_number()),
    )
    
    # Render reactable, but isolate
    output$table <- renderReactable({
        reactable(isolate(data$data))
    })
    
    # Update data on button click
    observeEvent(
        input$go,
        {
            # modify the one record
            x <- data$data |>
                filter(Index == input$index) |>
                mutate(Species = input$species)
            
            # rm from all data
            data$data <- data$data |>
                filter(Index != input$index) |>
                bind_rows(x) |>
                arrange(Index)
            
            # get index of change, save the needed page
            index <- x |> pull(Index)
            
            # update data and page at same time
            updateReactable("table",data = data$data, page =ceiling(index / 10))
        }
    )
}

shinyApp(ui, server)

编辑:我稍微简化了代码。

© www.soinside.com 2019 - 2024. All rights reserved.