我正在尝试使用
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
输出呈现新数据之前跳转到页面,这就是我假设的问题所在。
问题在于您在页面被新数据替换之前更新了页面。 您可以使用
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)
编辑:我稍微简化了代码。