R 隔离反应功能,以便在操作按钮后显示选择和过滤器

R 隔离反应功能,以便在操作按钮后显示选择和过滤器,r,function,shiny,reactive,R,Function,Shiny,Reactive,我正在尝试使用隔离命令将ui.R文件中的以下代码创建一个反应性函数,并将其放入服务器.R文件中,在该文件中,仅当用户输入了他们的选择和过滤器后,数据表才会填充 现在,数据表只是在运行过滤器和选择后自行填充,而无需单击runquery按钮 任何帮助都将不胜感激 actionButton("runit", "RUN QUERY") 非常感谢你 代码如下: 用户界面 库(DT) 图书馆(闪亮) 图书馆(shinydashboard) ui您需要隔离()所有不

我正在尝试使用
隔离
命令将
ui.R
文件中的以下代码创建一个
反应性
函数,并将其放入
服务器.R
文件中,在该文件中,仅当用户输入了他们的选择和过滤器后,数据表才会填充

现在,数据表只是在运行过滤器和选择后自行填充,而无需单击
runquery
按钮

任何帮助都将不胜感激

actionButton("runit", "RUN QUERY")

非常感谢你

代码如下:

用户界面

库(DT)
图书馆(闪亮)
图书馆(shinydashboard)
ui您需要
隔离()
所有不应触发事件的输入,您可以使用
req()
启用提交按钮:

  pairColFuns <- reactive({
    colChoices <- isolate(input$colChoices) #isolated
    names(colChoices) <- isolate(input$funChoices) #isolated
    
    return(colChoices)
  })
  
  # Construct DataFrame Based on User Inputs
  
  output$data <- renderDataTable({
    req(input$runit) # submit button should trigger
    colChoices <- pairColFuns()
    rowChoices <- isolate(input$rowChoices) #isolated
    
    countCols   <- unname(colChoices[names(colChoices) == "Count"])
    averageCols <- unname(colChoices[names(colChoices) == "Average"])
    medianCols  <- unname(colChoices[names(colChoices) == "Median"])
    sumCols     <- unname(colChoices[names(colChoices) == "Sum"])
    maxCols     <- unname(colChoices[names(colChoices) == "Maximum"])
    minCols     <- unname(colChoices[names(colChoices) == "Minimum"])
    
    displayTable <- as_tibble(data) %>%
      filter(
        hair_color %in% isolate(input$hairColorChoices), #isolated
        skin_color %in% isolate(input$skinColorChoices) #isolated
    ...

pairColFuns我将拆分表呈现和数据处理,然后您可以使用
eventReactive
方法。这样就省去了将每个输入包装到
隔离中的麻烦

首先制作一个计算数据的
eventReactive
。它仅在第一个
反应式
/输入更改时更新。然后,您可以使用此选项渲染表:

table_data <- eventReactive(input$runit, {
  colChoices <- pairColFuns()
  rowChoices <- input$rowChoices
  
  countCols   <- unname(colChoices[names(colChoices) == "Count"])
  averageCols <- unname(colChoices[names(colChoices) == "Average"])
  medianCols  <- unname(colChoices[names(colChoices) == "Median"])
  sumCols     <- unname(colChoices[names(colChoices) == "Sum"])
  maxCols     <- unname(colChoices[names(colChoices) == "Maximum"])
  minCols     <- unname(colChoices[names(colChoices) == "Minimum"])
  
  displayTable <- as_tibble(data) %>%
    filter(
      hair_color %in% input$hairColorChoices,
      skin_color %in% input$skinColorChoices
    ) %>%
    group_by(across(all_of(rowChoices))) %>%
    summarize(
      # Once again we've sacrificed a bit of elegance for clarity. This chunk will
      # apply the specified function to whichever columns are included in the 
      # specified variable. If the variable is empty, no operation is performed.
      fun_across({{countCols}}, length, "count"),
      fun_across({{averageCols}}, ~mean(.x, na.rm = TRUE), "average"),
      fun_across({{medianCols}}, ~median(.x, na.rm = TRUE), "median"),
      fun_across({{sumCols}}, ~sum(.x, na.rm = TRUE), "total"),
      fun_across({{maxCols}}, ~max(.x, na.rm = TRUE), "max"),
      fun_across({{minCols}}, ~min(.x, na.rm = TRUE), "min"),
      .groups = "drop"
    )
  
  displayTable
})

output$data <- renderDataTable({
  table_data()
  
})

table_data您可以稍微分解一下问题,以便更容易理解错误的来源和解决方法吗?
  pairColFuns <- reactive({
    colChoices <- isolate(input$colChoices) #isolated
    names(colChoices) <- isolate(input$funChoices) #isolated
    
    return(colChoices)
  })
  
  # Construct DataFrame Based on User Inputs
  
  output$data <- renderDataTable({
    req(input$runit) # submit button should trigger
    colChoices <- pairColFuns()
    rowChoices <- isolate(input$rowChoices) #isolated
    
    countCols   <- unname(colChoices[names(colChoices) == "Count"])
    averageCols <- unname(colChoices[names(colChoices) == "Average"])
    medianCols  <- unname(colChoices[names(colChoices) == "Median"])
    sumCols     <- unname(colChoices[names(colChoices) == "Sum"])
    maxCols     <- unname(colChoices[names(colChoices) == "Maximum"])
    minCols     <- unname(colChoices[names(colChoices) == "Minimum"])
    
    displayTable <- as_tibble(data) %>%
      filter(
        hair_color %in% isolate(input$hairColorChoices), #isolated
        skin_color %in% isolate(input$skinColorChoices) #isolated
    ...
table_data <- eventReactive(input$runit, {
  colChoices <- pairColFuns()
  rowChoices <- input$rowChoices
  
  countCols   <- unname(colChoices[names(colChoices) == "Count"])
  averageCols <- unname(colChoices[names(colChoices) == "Average"])
  medianCols  <- unname(colChoices[names(colChoices) == "Median"])
  sumCols     <- unname(colChoices[names(colChoices) == "Sum"])
  maxCols     <- unname(colChoices[names(colChoices) == "Maximum"])
  minCols     <- unname(colChoices[names(colChoices) == "Minimum"])
  
  displayTable <- as_tibble(data) %>%
    filter(
      hair_color %in% input$hairColorChoices,
      skin_color %in% input$skinColorChoices
    ) %>%
    group_by(across(all_of(rowChoices))) %>%
    summarize(
      # Once again we've sacrificed a bit of elegance for clarity. This chunk will
      # apply the specified function to whichever columns are included in the 
      # specified variable. If the variable is empty, no operation is performed.
      fun_across({{countCols}}, length, "count"),
      fun_across({{averageCols}}, ~mean(.x, na.rm = TRUE), "average"),
      fun_across({{medianCols}}, ~median(.x, na.rm = TRUE), "median"),
      fun_across({{sumCols}}, ~sum(.x, na.rm = TRUE), "total"),
      fun_across({{maxCols}}, ~max(.x, na.rm = TRUE), "max"),
      fun_across({{minCols}}, ~min(.x, na.rm = TRUE), "min"),
      .groups = "drop"
    )
  
  displayTable
})

output$data <- renderDataTable({
  table_data()
  
})