Skip to content

Commit 3f579f7

Browse files
committed
Add tests and docs
1 parent 988e298 commit 3f579f7

2 files changed

Lines changed: 119 additions & 45 deletions

File tree

R/supply_use.R

Lines changed: 74 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,32 @@
1+
# TODO: Revisit the whole file. I'm pretty sure there are mistakes,
2+
# along with incomplete parts. It's better to first finish the model
3+
# and then come back here.
4+
5+
#' Supply and use tables
6+
#'
7+
#' @description
8+
#' Create a table with processes, their inputs (_use_) and their
9+
#' outputs (_supply_).
10+
#'
11+
#' @returns
12+
#' A tibble with the supply and use data for processes.
13+
#' It contains the following columns:
14+
#' - `year`: The year in which the recorded event occurred.
15+
#' - `area`: The name of the country where the data is from.
16+
#' - `area_code`: FAOSTAT internal code for each country. Equivalences
17+
#' with ISO 3166-1 numeric can be found in the _Area Codes_ CSV from the
18+
#' zip file that can be downloaded from
19+
#' [FAOSTAT](https://www.fao.org/faostat/en/#data/FBS). TODO: Think about
20+
#' this, would be nice to use ISO3 codes but won't be enough for our periods
21+
#' - `item`: Natural language name for the item.
22+
#' - `item_code`: FAOSTAT internal code for each item.
23+
#'
24+
#' @export
25+
#'
26+
#' @examples
27+
#' \dontrun{
28+
#' build_supply_use()
29+
#' }
130
build_supply_use <- function() {
231
# TODO: There's a name mismatch in two items
332
# CBS_item supply_process_item
@@ -6,69 +35,81 @@ build_supply_use <- function() {
635
# Keep balance sheet names for now
736

837
.build_supply_use_from_inputs(
9-
supply_process_table = .get_processes_table("input/raw/items_supply.csv"),
10-
use_process_table = .get_processes_table("input/raw/items_use.csv"),
38+
supply_processes = .read_local_csv("input/raw/items_supply.csv"),
39+
use_processes = .read_local_csv("input/raw/items_use.csv"),
1140
coeffs = get_processing_coefs(get_file_path("processing_coefs")),
1241
cbs = get_wide_cbs(get_file_path("commodity_balance_sheet"))
1342
)
1443
}
1544

1645
.build_supply_use_from_inputs <- function(
17-
supply_process_table,
18-
use_process_table,
46+
supply_processes,
47+
use_processes,
1948
coeffs,
2049
cbs) {
21-
processes_table <- use_process_table |>
50+
processes_table <- .join_supply_use_processes(supply_processes, use_processes)
51+
52+
tibble::tibble() |>
53+
.add_use_for_feed(processes_table) |>
54+
.add_use_for_seed(processes_table, cbs) |>
55+
.add_use_for_slaughtering(processes_table) |>
56+
.add_supply_use_for_processing(processes_table, coeffs) |>
57+
.add_rest_of_supply(supply_processes, cbs)
58+
}
59+
60+
.join_supply_use_processes <- function(supply_processes, use_processes) {
61+
use_processes |>
2262
dplyr::full_join(
23-
supply_process_table,
63+
supply_processes,
2464
by = c("proc", "proc_code"),
2565
relationship = "many-to-many",
2666
suffix = c("_to_process", "_processed")
2767
)
28-
29-
dplyr::bind_rows(
30-
.add_use_for_feed(processes_table),
31-
.add_use_for_seed(processes_table, cbs),
32-
.add_use_for_slaughtering(processes_table),
33-
.add_supply_use_for_processing(processes_table, coeffs)
34-
)
3568
}
3669

37-
.add_use_for_seed <- function(processes_table, cbs) {
38-
processes <- processes_table |>
39-
dplyr::filter(type == "seedwaste")
70+
.add_rest_of_supply <- function(supply_use, supply_process_table, cbs) {
71+
items_done <- supply_use |>
72+
dplyr::filter(type == "supply") |>
73+
dplyr::distinct(item)
4074

41-
use <- processes |>
75+
cbs |>
76+
dplyr::anti_join(items_done, "item") |>
77+
dplyr::inner_join(supply_process_table, "item") |>
78+
dplyr::filter(domestic_supply > 0) |>
79+
dplyr::select(year, area, proc, item, domestic_supply) |>
80+
dplyr::rename(value = domestic_supply) |>
81+
dplyr::mutate(type = "supply") |>
82+
dplyr::bind_rows(supply_use)
83+
}
84+
85+
.add_use_for_seed <- function(supply_use, processes_table, cbs) {
86+
processes_table |>
87+
dplyr::filter(type == "seedwaste") |>
4288
# TODO: compare with full_join, why seedwaste use on animal products?
4389
dplyr::inner_join(cbs, dplyr::join_by(item_code_to_process == item_code)) |>
4490
dplyr::filter(seed > 0) |>
4591
dplyr::select(year, area, proc, item_to_process, seed) |>
4692
dplyr::rename(item = item_to_process, value = seed) |>
47-
dplyr::mutate(type = "use")
48-
49-
# supply <- processes |>
50-
# dplyr::inner_join(cbs, dplyr::join_by(item_code_processed == item_code)) |>
51-
# dplyr::filter(domestic_supply > 0) |>
52-
# dplyr::select(year, area, proc, item_processed, domestic_supply) |>
53-
# dplyr::rename(item = item_processed, value = domestic_supply) |>
54-
# dplyr::mutate(type = "supply")
55-
56-
dplyr::bind_rows(use)
93+
dplyr::mutate(type = "use") |>
94+
dplyr::bind_rows(supply_use)
5795
}
5896

5997
# TODO: Treat slaughtering processes
6098
# (probably need conversion factor from Livestock Units to physical unit)
61-
.add_use_for_slaughtering <- function(processes_table) {
62-
tibble::tibble()
99+
.add_use_for_slaughtering <- function(supply_use, processes_table) {
100+
supply_use
63101
}
64102

65103
# TODO: Treat animal feed use processes
66104
# Use feed intake data from Eduardo
67-
.add_use_for_feed <- function(processes_table) {
68-
tibble::tibble()
105+
.add_use_for_feed <- function(supply_use, processes_table) {
106+
supply_use
69107
}
70108

71-
.add_supply_use_for_processing <- function(processes_table, coeffs) {
109+
.add_supply_use_for_processing <- function(
110+
supply_use,
111+
processes_table,
112+
coeffs) {
72113
processes <- processes_table |>
73114
dplyr::filter(!type %in% c("feed", "seedwaste", "slaughtering")) |>
74115
# TODO: compare with full_join, deal with missing processes
@@ -86,11 +127,5 @@ build_supply_use <- function() {
86127
dplyr::rename(item = item_to_process, value = value_to_process) |>
87128
dplyr::mutate(type = "use")
88129

89-
dplyr::bind_rows(supply, use)
90-
}
91-
92-
.get_processes_table <- function(csv_path) {
93-
"extdata" |>
94-
system.file(csv_path, package = utils::packageName()) |>
95-
readr::read_csv(show_col_types = FALSE)
130+
dplyr::bind_rows(supply, use, supply_use)
96131
}

tests/testthat/test_supply_use.R

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ testthat::test_that(
66
"p1", "i1", "i2", "processing",
77
"p1", "i1", "i3", "processing",
88
"p1", "i4", "i2", "processing",
9-
"p2", "i1", "i5", "processing",
9+
"p2", "i5", "i6", "processing",
1010
"ignore", "ignore", "ignore", "seedwaste",
1111
"ignore", "ignore", "ignore", "feed",
1212
)
@@ -16,20 +16,21 @@ testthat::test_that(
1616
2000, "a1", "i1", 10, "i2", 20,
1717
2000, "a1", "i1", 10, "i3", 30,
1818
2000, "a1", "i4", 20, "i2", 40,
19-
2000, "a1", "i1", 30, "i5", 20
19+
2000, "a1", "i5", 30, "i6", 20
2020
)
2121
expected <- tibble::tribble(
2222
~year, ~area, ~proc, ~item, ~value, ~type,
2323
2000, "a1", "p1", "i1", 10, "use",
2424
2000, "a1", "p1", "i4", 20, "use",
25-
2000, "a1", "p2", "i1", 30, "use",
25+
2000, "a1", "p2", "i5", 30, "use",
2626
2000, "a1", "p1", "i2", 60, "supply",
2727
2000, "a1", "p1", "i3", 30, "supply",
28-
2000, "a1", "p2", "i5", 20, "supply",
28+
2000, "a1", "p2", "i6", 20, "supply",
2929
) |>
3030
dplyr::arrange(year, area, proc, item, type)
3131

32-
.add_supply_use_for_processing(processes_table, coeffs) |>
32+
tibble::tibble() |>
33+
.add_supply_use_for_processing(processes_table, coeffs) |>
3334
dplyr::arrange(year, area, proc, item, type) |>
3435
testthat::expect_equal(expected)
3536
}
@@ -55,7 +56,45 @@ testthat::test_that(".add_use_for_seed works for 'seedwaste' use items", {
5556
) |>
5657
dplyr::arrange(year, area, proc, item, type)
5758

58-
.add_use_for_seed(processes_table, cbs) |>
59+
tibble::tibble() |>
60+
.add_use_for_seed(processes_table, cbs) |>
5961
dplyr::arrange(year, area, proc, item, type) |>
6062
testthat::expect_equal(expected)
6163
})
64+
65+
testthat::test_that(
66+
".add_rest_of_supply takes domestic supply of still non checked output items",
67+
{
68+
supply_process_table <- tibble::tribble(
69+
~proc, ~item,
70+
"p1", "i1",
71+
"p2", "i2",
72+
"p3", "i3"
73+
)
74+
supply_use <- tibble::tribble(
75+
~year, ~area, ~proc, ~item, ~value, ~type,
76+
2000, "a1", "p1", "i1", 10, "use",
77+
2000, "a1", "p1", "i2", 10, "supply",
78+
)
79+
cbs <- tibble::tribble(
80+
~year, ~area, ~item, ~item_code, ~domestic_supply,
81+
2000, "a1", "i1", 1, 30,
82+
2000, "a1", "i2", 2, 40,
83+
2000, "a1", "i3", 2, 50,
84+
)
85+
expected <- supply_use |>
86+
dplyr::bind_rows(
87+
tibble::tribble(
88+
~year, ~area, ~proc, ~item, ~value, ~type,
89+
2000, "a1", "p1", "i1", 30, "supply",
90+
2000, "a1", "p3", "i3", 50, "supply"
91+
)
92+
) |>
93+
dplyr::arrange(year, area, proc, item, type)
94+
95+
supply_use |>
96+
.add_rest_of_supply(supply_process_table, cbs) |>
97+
dplyr::arrange(year, area, proc, item, type) |>
98+
testthat::expect_equal(expected)
99+
}
100+
)

0 commit comments

Comments
 (0)