如何从闪亮的应用程序中获取选定属性的汇总数据?

问题描述

有人可以帮助解决以下条件,这将是很棒的事情。

需求详细信息:-

如何动态地将多个属性传递给group_by / summaries子句以获取所选属性的汇总数据?在我的情况下,我可以使用下面的代码来实现相同的功能,但是按属性摘要属性将其限制为1组。如果我选择多个分组依据或摘要属性,则会引发错误

library(dplyr) 
library(data.table) 
library(shiny) 
library(DT)


df1 <- data.frame("name"=c("AAA","BBB","CCC"),"dept"=c("HR","HR","FIN"),"Salary"=c(1000,1345,5678),"Salary2"=c(4567,7896,5678))

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
  pickerInput("Id0001","group by attributes",choices = unique(names(df1)),multiple = TRUE,options = list(`live-search` = TRUE)),pickerInput("Id0002","summary attributes",actionButton("Id0003","show data")
  ),mainPanel( DT::DTOutput("data_tbl") )
  )
)

server <- function(input,output,session){
  
  
  reactive_string  <- eventReactive(input$Id0003,{
    if (input$Id0003 > 0) {
      dt_agg_ui <<- df1  %>%
        group_by(!!rlang::sym(input$Id0001)) %>% 
        summarise_at(vars(!!rlang::sym(input$Id0002)),funs(sum,n()))
    }
    dt_agg_ui
  })
  
  output$data_tbl <- DT::renderDT( {reactive_string()})
  }
shinyApp(ui = ui,server = server)

Working shiny screenshot with single group by and summary attribute

Error shiny screenshot with multiple group by and summary attributes:-

解决方法

使用dplyr::acrosstidyselect::all_of可以像这样实现:

library(dplyr) 
library(data.table) 
library(shiny) 
library(shinyWidgets) 
library(DT)


df1 <- data.frame("name"=c("AAA","BBB","CCC"),"dept"=c("HR","HR","FIN"),"Salary"=c(1000,1345,5678),"Salary2"=c(4567,7896,5678))

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      pickerInput("Id0001","group by attributes",choices = unique(names(df1)),multiple = TRUE,options = list(`live-search` = TRUE)),pickerInput("Id0002","summary attributes",actionButton("Id0003","show data")
    ),mainPanel( DT::DTOutput("data_tbl") )
  )
)

server <- function(input,output,session){
  
  
  reactive_string  <- eventReactive(input$Id0003,{
    if (input$Id0003 > 0) {
      dt_agg_ui <<- df1  %>%
        group_by(across(all_of(input$Id0001))) %>% 
        summarise(across(all_of(input$Id0002),.fns = list(sum = sum,n = ~ n())))
    }
    dt_agg_ui
  })
  
  output$data_tbl <- DT::renderDT( {reactive_string()})
}
shinyApp(ui = ui,server = server)

enter image description here