我有一个闪亮的应用程序,可以进行模糊匹配。 用户输入产品、搜索词和容差(即与搜索词的可接受距离)。 由于数据集很大,我只想在按下“do_search”按钮时更新表格。
第一次加载时它可以工作,我输入所有 3 个值,然后按“do_search”,它就可以工作。
但后来我注意到,当我更改搜索词、产品或容差时,表格会即时刷新。 我原以为这些东西只有在按下按钮时才会更新。
界面如下:
ui <- fluidPage(
useShinyjs(),
#theme = bs_theme(version = 4, bootswatch = "minty"),
headerPanel("TCS Adverse Event Fuzzy Search Tool"),
fluidRow(
column(3,
disabled(
selectInput("ingredients", label = "Select one or more Active Ingredients:", choices = NULL, multi=TRUE))
),
column(3,
disabled(
textInput("search_term", "AE Search Term:"))
),
column(3,
disabled(
sliderInput("search_tolerance", label = "Search Tolerance:",
min = 0, max = 0.7, value = 0.2, step = 0.05))
),
disabled(
actionButton("do_search", "Perform Search"))
)
,reactableOutput("search_results")
)
服务器(截断)代码如下:
server <- function(input, output, session) {
# retrieve master data set for session
cases_df <- reactive({
return(get_adverse_events_from_db())
})
ingredients_df <- reactive({
df <- get_list_of_actives_from_db()
message(paste("Length of actives: ", nrow(df)))
return(df)
})
observeEvent(ingredients_df(), {
updateSelectInput(session,
"ingredients",
label = "Select one or more Active Ingredients:",
choices = ingredients_df()$PRIMARY_SUSPECT_KEY_INGREDIENT,
selected = NULL
)
})
observeEvent(cases_df(), {
enable("ingredients")
enable("search_term")
enable("search_tolerance")
enable("do_search")
})
# run when do_search is clicked
observeEvent(input$do_search, {
output$search_results <- renderReactable({
filter(match_score <= input$search_tolerance))
filtered_df <- calculate_match_score(filter(cases_df(), PRIMARY_SUSPECT_KEY_INGREDIENT %in% input$ingredients), input$search_term) %>% filter(match_score <= input$search_tolerance)
reactable(
filtered_df,
bordered=TRUE,
highlight=TRUE,
filterable=TRUE,
striped=TRUE,
outlined=TRUE,
我的困惑是为什么当按下观察到的按钮“do_search”以外的输入时表格会刷新:
# run when do_search is clicked
observeEvent(input$do_search, {
output$search_results <- renderReactable({
而不是
observeEvent(input$do_search, {
output$search_results <- renderReactable({...})
})
试试这个
filtered_df <- eventReactive(input$do_search, {
calculate_match_score(filter(cases_df(), PRIMARY_SUSPECT_KEY_INGREDIENT %in% input$ingredients), input$search_term) %>% filter(match_score <= input$search_tolerance)
})
output$search_results <- renderReactable({
reactable(filtered_df(), ...)
})