-
Notifications
You must be signed in to change notification settings - Fork 0
/
module_crops_summary.R
114 lines (98 loc) · 4.42 KB
/
module_crops_summary.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File: module_crops_summary.R
# Reactive data setup for Crops
full_data_crops <- reactive({
crops_summary_data
})
# UI for Summary Crops Module
cropsSummaryUI <- function(id) {
ns <- NS(id)
tagList(
sidebarLayout(
sidebarPanel(
width = 3,
div("Adjust the sliders to compare data from different years.",
style = "font-size: 14px; font-weight: bold; margin-bottom: 10px;"),
sliderInput(ns("summary_current_year_crops"), "Year of interest", min = 2012, max = census_year, value = census_year, step = 1, sep = ""),
sliderInput(ns("summary_comparison_year_crops"), "Comparison year", min = 2012, max = census_year, value = census_year - 1, step = 1, sep = "")
),
mainPanel(
id = ns("mainpanel"),
width = 9,
tabsetPanel(
id = ns("tabs"),
tabPanel("Summary Page",
value = "Summary_Page",
fluidRow(
column(width = 6, valueBoxUI(ns("totalCombineHarvestedCrops")), style = "padding-right: 0; padding-left: 0; padding-bottom: 10px;"),
column(width = 6, valueBoxUI(ns("totalCropsForStockfeeding")), style = "padding-right: 0; padding-left: 0; padding-bottom: 10px;")
),
fluidRow(
column(width = 6, valueBoxUI(ns("vegetablesForHumanConsumption")), style = "padding-right: 0; padding-left: 0;"),
column(width = 6, valueBoxUI(ns("softFruit")), style = "padding-right: 0; padding-left: 0;")
),
# Add the footer text
div(
style = "margin-top: 20px; padding: 10px; border-top: 1px solid #ddd;",
HTML("<strong>Note:</strong> Poultry estimates for 2023 are not comparable to previous years due to methodological improvements.")
)
),
tabPanel("Data Table",
fluidRow(
column(12,
DTOutput(ns("data_table")),
tags$div(
style = "margin-top: 20px;",
downloadButton(ns("download_data"), "Download Data")
)
)
)
),
footer = generateCensusTableFooter()
)
)
)
)
}
library(scales)
cropsSummaryServer <- function(id) {
moduleServer(id, function(input, output, session) {
ns <- session$ns
current_year <- reactive({ input$summary_current_year_crops })
comparison_year <- reactive({ input$summary_comparison_year_crops })
valueBoxServer("totalCombineHarvestedCrops", full_data_crops, "Crop/Land use", reactive("Total combine harvested crops"), current_year, comparison_year, "hectares")
valueBoxServer("totalCropsForStockfeeding", full_data_crops, "Crop/Land use", reactive("Total crops for stockfeeding"), current_year, comparison_year, "hectares")
valueBoxServer("vegetablesForHumanConsumption", full_data_crops, "Crop/Land use", reactive("Vegetables for human consumption"), current_year, comparison_year, "hectares")
valueBoxServer("softFruit", full_data_crops, "Crop/Land use", reactive("Soft fruit"), current_year, comparison_year, "hectares")
# Pivot the data wider for the data table and format numbers with commas, excluding the 'Year' column
pivoted_data <- reactive({
full_data_crops() %>%
pivot_wider(names_from = `Crop/Land use`, values_from = `Value`) %>%
mutate(across(where(is.numeric) & !contains("Year"), comma)) # Format all numeric columns except 'Year' with commas
})
# Render the pivoted data table
output$data_table <- renderDT({
datatable(pivoted_data(), options = list(
scrollX = TRUE, # Enable horizontal scrolling
pageLength = 20 # Show 20 entries by default
))
})
# Download handler for the pivoted data
output$download_data <- downloadHandler(
filename = function() {
paste("Crops_Summary_Data_", Sys.Date(), ".csv", sep = "")
},
content = function(file) {
write.csv(pivoted_data(), file, row.names = FALSE)
}
)
})
}
# Testing module
content_demo <- function() {
ui <- fluidPage(cropsSummaryUI("summary_crops_test"))
server <- function(input, output, session) {
cropsSummaryServer("summary_crops_test")
}
shinyApp(ui, server)
}
content_demo()