我想在R Shiny应用程序中使用用户输入更新 Dataframe 。用户选择一行数据,然后选择使用selectInput
更新物种列的值。每次更新都需要累积,即新更新更新以前更新的数据。我尝试按照answer使用reactiveValues
,但无法使其工作。
library(shiny)
library(reactable)
library(tidyverse)
iris_df = iris %>%
mutate(
id = row_number(),
Species = as.character(Species)
)
ui <- fluidPage(
navbarPage(
"HELP!",
tabPanel(
"Iris",
sidebarLayout(
sidebarPanel(
selectInput("update_species", "Update species", choices = c("Rose", "Daffodil"))
),
mainPanel(fluidRow(reactableOutput("iris")))
)
)
)
)
server <- function(input, output) {
observeEvent(input$update_species, {
iris_df = iris_df %>%
mutate(Species = case_when(id == selected_row() ~ input$update_species, TRUE ~ Species))
})
selected_row = reactive(getReactableState("iris", "selected"))
output$iris = renderReactable({
reactable(
iris_df,
selection = "single",
)
})
}
shinyApp(ui = ui, server = server)
1条答案
按热度按时间tzdcorbm1#
您的代码的第一个问题是
observeEvent
由input$update_species
触发,如果没有选择行,selected_row()
将是NULL
,则会导致错误。为了防止出现这种情况,您可以添加req(selected_row())
或使用selected_row()
来触发observeEvent
,就像我在下面的代码中所做的那样。接下来,正如您已经意识到的,您需要
reactiveVal
或reactiveValues
来根据用户选择实际更新observeEvent
内的 Dataframe 。这是更新第1、4和7行后的输出示例: