首页 > 解决方案 > 根据其他反应性对象过滤反应性对象,而两者都依赖于第三个反应性对象

问题描述

我正在尝试使用其他反应对象“#3”过滤反应对象“#4”,但没有成功,我认为问题在于它们都依赖于另一个反应对象“#2”。这张图片应该有帮助:

问题

这是reprex

library(shiny)
library(DT)
library(dplyr)

dat <- as.data.frame( list(
  X = c("A", "A", "B", "B", "C"),
  Y = c(1,2,3,4,5)
))

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput("myinput", "Input:",min = 1, max = 5,value = 3)
    ),
    mainPanel(
      br(),
      fluidRow(column(2, DTOutput('table_data'))),
      br(),
      fluidRow(column(2, DTOutput('table_filtered'))),
      br(),
      fluidRow(column(2, DTOutput('table_filtered_not_A'))),
      br(),br(),
      fluidRow(column(2, DTOutput('table_grouped')))
    )
  )
)

server <- function(input, output) {
  
  dat_rv <- reactiveValues(df = dat)
  
  dat_filtered <- reactive({
    dat_rv$df %>% 
      filter(
        !isTruthy( input$myinput ) | Y <= input$myinput
      )
  })
  
  dat_not_A <- reactive({
    dat_not_A <- dat_filtered() %>%
      filter(X != "A") %>% 
      select(X)
  })
  
  dat_grouped <- reactive({
    dat_grouped <- dat_filtered() %>%
      filter(X %in% dat_not_A()) %>% # HERE IS THE PROBLEM?
      group_by(X) %>%
      summarise(Y = sum(Y))
    return(dat_grouped)
  })
  
  output$table_data = renderDT(dat, options = list(dom = 't'), rownames = FALSE)
  output$table_filtered = renderDT(dat_filtered(), options = list(dom = 't'), rownames = FALSE)
  output$table_filtered_not_A = renderDT(dat_not_A(), options = list(dom = 't'), rownames = FALSE)
  output$table_grouped = renderDT(dat_grouped(), options = list(dom = 't'), rownames = FALSE)
  
}

shinyApp(ui = ui, server = server)

我也尝试过使用隔离,但它不起作用。我错过了什么吗?

此致。

标签: rshinyshiny-reactivity

解决方案


你需要使用:

  dat_grouped <- reactive({
    dat_grouped <- dat_filtered() %>%
      filter(X %in% unique(dat_not_A()$X)) %>% 
      group_by(X) %>%
      summarise(Y = sum(Y))
    return(dat_grouped)
  })

并不是:

  dat_grouped <- reactive({
    dat_grouped <- dat_filtered() %>%
      filter(X %in% dat_not_A()) %>%
      group_by(X) %>%
      summarise(Y = sum(Y))
    return(dat_grouped)
  })


推荐阅读