R 根据设置条件组
我有一组看起来像这样的数据:R 根据设置条件组,r,shiny,dplyr,shiny-server,shiny-reactivity,R,Shiny,Dplyr,Shiny Server,Shiny Reactivity,我有一组看起来像这样的数据: +----------+------------+-------+-------+ | step1 | step2 | step3 | step4 | +----------+------------+-------+-------+ | Region 1 | District A | 1A | 571 | | Region 1 | District A | 1A | 356 | | Region 1 | District A |
+----------+------------+-------+-------+
| step1 | step2 | step3 | step4 |
+----------+------------+-------+-------+
| Region 1 | District A | 1A | 571 |
| Region 1 | District A | 1A | 356 |
| Region 1 | District A | 1B | 765 |
| Region 1 | District B | 1B | 752 |
| Region 2 | District C | 2C | 885 |
| Region 2 | District C | 2D | 73 |
| Region 2 | District D | 2D | 241 |
| Region 2 | District D | 2D | 823 |
| Region 3 | District E | 3E | 196 |
| Region 3 | District E | 3E | 103 |
| Region 3 | District F | 3E | 443 |
| Region 3 | District F | 3F | 197 |
+----------+------------+-------+-------+
我已经设置了以下脚本,它以编写的方式使用selectizeGroupServer在步骤1、步骤2和步骤3之间自动设置过滤,以便它们链接在一起,即如果过滤区域1,它将只返回步骤2和步骤3中的相关选项
下面的脚本返回我正在寻找的结果,如果您希望它以一种直接的方式逐个分组。所以在初始运行时,它将显示所有11个结果的图形输出。如果我按区域1过滤,它将返回步骤4中链接到区域1的所有四个图形的图形
但是我想设置它,当我选择一个选项时,它实际上会按照它下面的层次选项分组。因此,如果我按区域1进行过滤,它将返回两列:地区A 1692的汇总和地区B 752的汇总。如果我同时选择了Region 1和District A,它将返回两列:聚合1A 927和绑定到District A 765的聚合1B
我如何设置它以实现这一点
library(highcharter)
library(shiny)
library(shinyWidgets)
library(dplyr)
step1 <- c('Region 1', 'Region 1', 'Region 1', 'Region 1', 'Region 2', 'Region 2', 'Region 2', 'Region 2', 'Region 3', 'Region 3', 'Region 3', 'Region 3')
step2 <- c('District A', 'District A', 'District A', 'District B', 'District C', 'District C', 'District D', 'District D', 'District E', 'District E', 'District F', 'District F')
step3 <- c('1A', '1A', '1B', '1B', '2C', '2D', '2D', '2D', '3E', '3E', '3E', '3F')
step4 <- c(571,356,765,752,885,73,241,823,196,103,443,197)
ui <- fluidPage(
fluidRow(
column(
width = 5, offset = 1,
panel(
selectizeGroupUI(
id = "foo",
params = list(
Step1 = list(inputId = "step1", title = "Step1:"),
Step2 = list(inputId = "step2", title = "Step2:"),
Step3 = list(inputId = "step3", title = "Step3:")
))
),
highchartOutput(outputId = "table")
)
)
)
server <- function(input, output, session) {
abc <- callModule(
module = selectizeGroupServer,
id = "foo",
data = df,
vars = c("step1", "step2", "step3")
)
output$table <- renderHighchart({
bar <- abc()
xyz <- bar %>% filter(is.null(input$step1) | step1 %in% input$step1,
is.null(input$step2) | step2 %in% input$step2,
is.null(input$step3) | step3 %in% input$step3) %>% group_by_all() %>% summarise(results = sum(step4))
highchart() %>% hc_add_series(data = xyz, type = "column", hcaes(y = results),
showInLegend = TRUE) %>% hc_add_theme(hc_theme_flat())
})
}
谢谢 首先,我们需要找出分组依据的列。在本例中,我假设它是第一列,包含多个选项。代码的其余部分非常相似,除了groupbyu都被groupbyu替换
如果为单个选项选择多个值,这将不起作用,但该解决方案应该非常类似 似乎您正在寻找聚合。请检查以下内容:
library(highcharter)
library(shiny)
library(shinyWidgets)
# library(dplyr)
DF <- data.frame(
step1 = c('Region 1', 'Region 1', 'Region 1', 'Region 1', 'Region 2', 'Region 2', 'Region 2', 'Region 2', 'Region 3', 'Region 3', 'Region 3', 'Region 3'),
step2 = c('District A', 'District A', 'District A', 'District B', 'District C', 'District C', 'District D', 'District D', 'District E', 'District E', 'District F', 'District F'),
step3 = c('1A', '1A', '1B', '1B', '2C', '2D', '2D', '2D', '3E', '3E', '3E', '3F'),
step4 = c(571,356,765,752,885,73,241,823,196,103,443,197),
stringsAsFactors = FALSE)
ui <- fluidPage(
fluidRow(
column(
width = 5, offset = 1,
panel(
selectizeGroupUI(
id = "foo",
params = list(
Step1 = list(inputId = "step1", title = "Step1:"),
Step2 = list(inputId = "step2", title = "Step2:"),
Step3 = list(inputId = "step3", title = "Step3:")
))
),
highchartOutput(outputId = "table")
)
)
)
server <- function(input, output, session) {
abc <- callModule(
module = selectizeGroupServer,
id = "foo",
data = DF,
vars = c("step1", "step2", "step3")
)
output$table <- renderHighchart({
req(abc())
bar <- aggregate(step4 ~ step1+step2, abc(), sum)
highchart() %>% hc_add_series(data = bar, type = "column", hcaes(y = step4), showInLegend = TRUE) %>% hc_add_theme(hc_theme_flat())
})
}
shinyApp(ui, server)
@akrun刚刚编辑了脚本,以使其易于放入数据帧,或者以您认为最适合的方式进行设置啊,是的,当然。谢谢你接电话。编辑了我的第一篇文章。因为你已经格式化了它,不再需要了。我想了解的一件事是,这里的输入是如何变化的。在您的情况下,您正在使用|进行筛选。如果您需要层次结构组,则使用librarydata.table更简单;dt1还有一个选项是在
library(highcharter)
library(shiny)
library(shinyWidgets)
# library(dplyr)
DF <- data.frame(
step1 = c('Region 1', 'Region 1', 'Region 1', 'Region 1', 'Region 2', 'Region 2', 'Region 2', 'Region 2', 'Region 3', 'Region 3', 'Region 3', 'Region 3'),
step2 = c('District A', 'District A', 'District A', 'District B', 'District C', 'District C', 'District D', 'District D', 'District E', 'District E', 'District F', 'District F'),
step3 = c('1A', '1A', '1B', '1B', '2C', '2D', '2D', '2D', '3E', '3E', '3E', '3F'),
step4 = c(571,356,765,752,885,73,241,823,196,103,443,197),
stringsAsFactors = FALSE)
ui <- fluidPage(
fluidRow(
column(
width = 5, offset = 1,
panel(
selectizeGroupUI(
id = "foo",
params = list(
Step1 = list(inputId = "step1", title = "Step1:"),
Step2 = list(inputId = "step2", title = "Step2:"),
Step3 = list(inputId = "step3", title = "Step3:")
))
),
highchartOutput(outputId = "table")
)
)
)
server <- function(input, output, session) {
abc <- callModule(
module = selectizeGroupServer,
id = "foo",
data = DF,
vars = c("step1", "step2", "step3")
)
output$table <- renderHighchart({
req(abc())
bar <- aggregate(step4 ~ step1+step2, abc(), sum)
highchart() %>% hc_add_series(data = bar, type = "column", hcaes(y = step4), showInLegend = TRUE) %>% hc_add_theme(hc_theme_flat())
})
}
shinyApp(ui, server)