diff --git a/R/electricity.R b/R/electricity.R
index fc48e0b..b203dca 100644
--- a/R/electricity.R
+++ b/R/electricity.R
@@ -19,7 +19,7 @@
#' @keywords internal
module.electricity <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
if(mode == GETQ) {
# Return titles of necessary queries
@@ -37,7 +37,7 @@ module.electricity <- function(mode, allqueries, aggkeys, aggfn, years,
dplyr::mutate(subsector = sub('rooftop_pv', 'solar', subsector),
subsector = paste0(subsector,
dplyr::if_else(grepl('CCS', technology), ' CCS', '')))
- elct <- filter(elct, years, filters)
+ elct <- filter(elct, years, filters, filter_operator)
elct <- aggregate(elct, aggfn, aggkeys)
if(!is.na(ounit)) {
diff --git a/R/emissions.R b/R/emissions.R
index ead9542..8c9db45 100644
--- a/R/emissions.R
+++ b/R/emissions.R
@@ -1,8 +1,6 @@
#### Data modules for the emissions group
-#' CO2 emissions Data Module
-#'
-#' Produce CO2 emissions
+#' Emissions Data Module
#'
#' The raw table used by this module has columns:
#' \itemize{
@@ -16,7 +14,7 @@
#' @keywords internal
module.co2_emissions <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
if(mode == GETQ) {
# Return titles of necessary queries
@@ -34,13 +32,408 @@ module.co2_emissions <- function(mode, allqueries, aggkeys, aggfn, years,
dplyr::group_by(Units, scenario, region, year, service, mode, submode) %>%
dplyr::summarise(value=sum(value)) %>%
dplyr::ungroup()
- co2 <- filter(co2, years, filters)
+ co2 <- filter(co2, years, filters, filter_operator)
co2 <- aggregate(co2, aggfn, aggkeys)
co2 <- unitconv_co2(co2, ounit)
co2
}
}
+module.bc_emissions_by_subsector <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'BC emissions by subsector'
+ }
+ else {
+ message('Function for processing variable: BC emissions by subsector')
+ bc_subsector <- allqueries$'BC emissions by subsector'
+ bc_subsector <- filter(bc_subsector, years, filters, filter_operator)
+ bc_subsector <- aggregate(bc_subsector, aggfn, aggkeys)
+
+ if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_mass(bc_subsector$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ bc_subsector$value <- bc_subsector$value * cfac
+ bc_subsector$Units <- ounit
+ }
+ }
+
+ bc_subsector
+ }
+}
+
+module.ch4_emissions_by_subsector <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'CH4 emissions by subsector'
+ }
+ else {
+ message('Function for processing variable: CH4 emissions by subsector')
+ ch4_subsector <- allqueries$'CH4 emissions by subsector'
+ ch4_subsector <- filter(ch4_subsector, years, filters, filter_operator)
+ ch4_subsector <- aggregate(ch4_subsector, aggfn, aggkeys)
+
+ if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_mass(ch4_subsector$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ ch4_subsector$value <- ch4_subsector$value * cfac
+ ch4_subsector$Units <- ounit
+ }
+ }
+
+ ch4_subsector
+ }
+}
+
+module.co_emissions_by_subsector <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'CO emissions by subsector'
+ }
+ else {
+ message('Function for processing variable: CO emissions by subsector')
+ CO_subsector <- allqueries$'CO emissions by subsector'
+ CO_subsector <- filter(CO_subsector, years, filters, filter_operator)
+ CO_subsector <- aggregate(CO_subsector, aggfn, aggkeys)
+
+ if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_mass(CO_subsector$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ CO_subsector$value <- CO_subsector$value * cfac
+ CO_subsector$Units <- ounit
+ }
+ }
+
+ CO_subsector
+ }
+}
+
+module.co2_emissions_by_subsector <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'CO2 emissions by subsector'
+ }
+ else {
+ message('Function for processing variable: CO2 emissions by subsector')
+ CO2_subsector <- allqueries$'CO2 emissions by subsector'
+ CO2_subsector <- filter(CO2_subsector, years, filters, filter_operator)
+ CO2_subsector <- aggregate(CO2_subsector, aggfn, aggkeys)
+
+ if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_co2(CO2_subsector$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ CO2_subsector$value <- CO2_subsector$value * cfac
+ CO2_subsector$Units <- ounit
+ }
+ }
+
+ CO2_subsector
+ }
+}
+
+module.ghg_emissions_by_region <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'GHG emissions by region'
+ }
+ else {
+ message('Function for processing variable: GHG emissions by region')
+ ghg_region <- allqueries$'GHG emissions by region'
+ ghg_region <- filter(ghg_region, years, filters, filter_operator)
+ ghg_region <- aggregate(ghg_region, aggfn, aggkeys)
+
+ if((!is.na(ounit))&(grepl('CO2', filters))) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_co2(ghg_region$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ ghg_region$value <- ghg_region$value * cfac
+ ghg_region$Units <- ounit
+ }
+ }
+
+ else if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_mass(ghg_region$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ ghg_region$value <- ghg_region$value * cfac
+ ghg_region$Units <- ounit
+ }
+ }
+
+
+
+ ghg_region
+ }
+}
+
+module.ghg_emissions_by_technology <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'GHG emissions by technology'
+ }
+ else {
+ message('Function for processing variable: GHG emissions by technology')
+ ghg_tech <- allqueries$'GHG emissions by technology'
+ ghg_tech <- filter(ghg_tech, years, filters, filter_operator)
+ ghg_tech <- aggregate(ghg_tech, aggfn, aggkeys)
+
+ if((!is.na(ounit))&(grepl('CO2', filters))) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_co2(ghg_tech$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ ghg_tech$value <- ghg_tech$value * cfac
+ ghg_tech$Units <- ounit
+ }
+ }
+
+ else if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_mass(ghg_tech$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ ghg_tech$value <- ghg_tech$value * cfac
+ ghg_tech$Units <- ounit
+ }
+ }
+
+ ghg_tech
+ }
+}
+
+module.nh3_emissions_by_subsector <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'NH3 emissions by subsector'
+ }
+ else {
+ message('Function for processing variable: NH3 emissions by subsector')
+ NH3_subsector <- allqueries$'NH3 emissions by subsector'
+ NH3_subsector <- filter(NH3_subsector, years, filters, filter_operator)
+ NH3_subsector <- aggregate(NH3_subsector, aggfn, aggkeys)
+
+ if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_mass(NH3_subsector$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ NH3_subsector$value <- NH3_subsector$value * cfac
+ NH3_subsector$Units <- ounit
+ }
+ }
+
+ NH3_subsector
+ }
+}
+
+module.nmvoc_emissions_by_subsector <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'NMVOC emissions by subsector'
+ }
+ else {
+ message('Function for processing variable: NMVOC emissions by subsector')
+ NMVOC_subsector <- allqueries$'NMVOC emissions by subsector'
+ NMVOC_subsector <- filter(NMVOC_subsector, years, filters, filter_operator)
+ NMVOC_subsector <- aggregate(NMVOC_subsector, aggfn, aggkeys)
+
+ if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_mass(NMVOC_subsector$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ NMVOC_subsector$value <- NMVOC_subsector$value * cfac
+ NMVOC_subsector$Units <- ounit
+ }
+ }
+
+ NMVOC_subsector
+ }
+}
+
+module.nox_emissions_by_subsector <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'NOx emissions by subsector'
+ }
+ else {
+ message('Function for processing variable: NOx emissions by subsector')
+ NOx_subsector <- allqueries$'NOx emissions by subsector'
+ NOx_subsector <- filter(NOx_subsector, years, filters, filter_operator)
+ NOx_subsector <- aggregate(NOx_subsector, aggfn, aggkeys)
+
+ if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_mass(NOx_subsector$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ NOx_subsector$value <- NOx_subsector$value * cfac
+ NOx_subsector$Units <- ounit
+ }
+ }
+
+ NOx_subsector
+ }
+}
+
+module.oc_emissions_by_subsector <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'OC emissions by subsector'
+ }
+ else {
+ message('Function for processing variable: OC emissions by subsector')
+ OC_subsector <- allqueries$'OC emissions by subsector'
+ OC_subsector <- filter(OC_subsector, years, filters, filter_operator)
+ OC_subsector <- aggregate(OC_subsector, aggfn, aggkeys)
+
+ if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_mass(OC_subsector$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ OC_subsector$value <- OC_subsector$value * cfac
+ OC_subsector$Units <- ounit
+ }
+ }
+
+ OC_subsector
+ }
+}
+
+module.so2_emissions_by_subsector <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'SO2 emissions by subsector'
+ }
+ else {
+ message('Function for processing variable: SO2 emissions by subsector')
+ SO2_subsector <- allqueries$'SO2 emissions by subsector'
+ SO2_subsector <- filter(SO2_subsector, years, filters, filter_operator)
+ SO2_subsector <- aggregate(SO2_subsector, aggfn, aggkeys)
+
+ if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ if(grepl('Mt', ounit)) {
+ ounit_convert <- 'Mt'
+ }
+ else {
+ ounit_convert <- ounit
+ }
+ cfac <- unitconv_mass(SO2_subsector$Units[1], ounit_convert)
+ if(!is.na(cfac)) {
+ SO2_subsector$value <- SO2_subsector$value * cfac
+ SO2_subsector$Units <- ounit
+ }
+ }
+
+ SO2_subsector
+ }
+}
+
#' CO2 emissions by end-use sector Data Module
#'
#' Produce service output by technology and vintage
diff --git a/R/filtering.R b/R/filtering.R
index 6256d93..ecd2d69 100644
--- a/R/filtering.R
+++ b/R/filtering.R
@@ -12,7 +12,7 @@
#' be parsed and applied to the input table.
#' @return Filtered variable table.
#' @keywords internal
-filter <- function(tbl, years, filterstr)
+filter <- function(tbl, years, filterstr, filter_operator)
{
mask <- rep(TRUE, nrow(tbl))
@@ -21,10 +21,20 @@ filter <- function(tbl, years, filterstr)
mask <- mask & (tbl$year %in% years)
}
+ if(!(is.na(filter_operator) || filter_operator == '')) {
+ fsplit_o <-
+ stringr::str_split(filter_operator, ',') %>% unlist
+ }
+ else {
+ fsplit_o <- NA
+ }
+
if(!(is.na(filterstr) || filterstr == '')) {
fsplit <-
stringr::str_split(filterstr, ',') %>% unlist
+
+
## This produces a matrix of string matches. Each row is the result of
## parsing one filter. Each column is one of the match groups.
filters <- stringr::str_match(fsplit, filterpattern)
@@ -41,13 +51,38 @@ filter <- function(tbl, years, filterstr)
## result of applying one filter to the table.
fmasks <- apply(filters, 1, function(x) {dofilter(x, tbl)})
+ if((length(fsplit_o)>1)&(fsplit_o[1]=="AND")&(fsplit_o[2]=="OR")) {
+ fmasks <- cbind(fmasks[ , 1], (rowSums(fmasks[ ,c(-1)])>=1))
+ mask <- mask & apply(fmasks, 1, function(x) {all(x)})
+ }
+ else if((length(fsplit_o)==1)&(is.na(filter_operator))&(nrow(filters)==1)) {
+ mask <- mask & apply(fmasks, 1, function(x) {all(x)})
+ }
+ else if((length(fsplit_o)==1)&(!is.na(filter_operator))&(filter_operator=="OR")) {
+ fmasks <- cbind(mask, (rowSums(fmasks)==1))
+ mask <- mask & apply(fmasks, 1, function(x) {all(x)})
+ }
+ else if((length(fsplit_o)==1)&(!is.na(filter_operator))&(filter_operator=="AND")) {
+ mask <- mask & apply(fmasks, 1, function(x) {all(x)})
+ }
+ else if((length(fsplit_o)==1)&(is.na(filter_operator))&(nrow(filters)>1)) {
+ warning('Filter operator not provided. Applying "AND".')
+ mask <- mask & apply(fmasks, 1, function(x) {all(x)})
+ }
+ else {
+ warning('Unrecognized filter operator, "', filter_operator, '". Applying "AND".')
+ mask <- mask & apply(fmasks, 1, function(x) {all(x)})
+ }
+
## This applies & across every row; the result is true for rows that
## passed all the filters, false for those that failed any of them.
- mask <- mask & apply(fmasks, 1, function(x) {all(x)})
+ #mask <- mask & apply(fmasks, 1, function(x) {all(x)})
}
## select the rows for which all filters returned TRUE.
- tbl[mask,]
+ tbl[mask,]
+
+
}
#' List of available filter functions
@@ -70,7 +105,7 @@ filterfns <- list(
#' Regexp for matching '(arg1; arg2; arg3)'
#' @keywords internal
-filterpattern <- '\\(([^;]+);([^;]+);([^)]+)\\)'
+filterpattern <- '\\(([^();]+);([^;]+);([^)]+)\\)'
#' Apply a filter string to a table
#'
diff --git a/R/final_energy.R b/R/final_energy.R
new file mode 100644
index 0000000..473f7a2
--- /dev/null
+++ b/R/final_energy.R
@@ -0,0 +1,42 @@
+#### Data modules for the emissions group
+
+#' Final Energy Data Module
+
+#'
+#' The raw table used by this module has columns:
+#' \itemize{
+#' \item{scenario}
+#' \item{region}
+#' \item{year}
+#' \item{value}
+#' \item{Units}
+#' }
+#'
+#' @keywords internal
+
+module.final_energy <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
+{
+ if(mode == GETQ) {
+ # Return titles of necessary queries
+ # For more complex variables, will return multiple query titles.
+ 'Total final energy by detailed end-use sector'
+ }
+ else {
+ message('Function for processing variable: Total final energy by detailed end-use sector')
+ final_e <- allqueries$'Total final energy by detailed end-use sector'
+ final_e <- filter(final_e, years, filters, filter_operator)
+ final_e <- aggregate(final_e, aggfn, aggkeys)
+
+ if(!is.na(ounit)) {
+ ## skip unit conversion if output unit not specified.
+ cfac <- unitconv_energy(final_e$Units[1], ounit)
+ if(!is.na(cfac)) {
+ final_e$value <- final_e$value * cfac
+ final_e$Units <- ounit
+ }
+ }
+
+ final_e
+ }
+}
diff --git a/R/mcl.R b/R/mcl.R
index 85c7571..4ed7303 100644
--- a/R/mcl.R
+++ b/R/mcl.R
@@ -338,15 +338,16 @@ process_scenario <- function(scen, dbloc, dbname, q2run, varctl)
## Process each requested variable
rslts <-
- Map(function(var, aggkeys, aggfn, years, filters, ounit) {
+ Map(function(var, aggkeys, aggfn, years, filters, filter_operator, ounit) {
runModule(var, RUN, queries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
},
varctl[['GCAM variable']],
varctl[['aggregation keys']],
varctl[['aggregation function']],
varctl[['years']],
varctl[['filters']],
+ varctl[['filter_operator']],
varctl[['output units']])
## Rename variables to their output values
@@ -413,7 +414,7 @@ validatectl <- function(scenctl, varctl)
scenrqd <- scencols
varcols <- c('GCAM variable', 'output variable', 'aggregation keys',
- 'aggregation function', 'years', 'filters',
+ 'aggregation function', 'years', 'filters','filter_operator',
'output units')
varrqd <- varcols[1:2]
diff --git a/R/primary_energy.R b/R/primary_energy.R
index 5abc200..55c14c2 100644
--- a/R/primary_energy.R
+++ b/R/primary_energy.R
@@ -15,8 +15,8 @@
#'
#' @keywords internal
-module.primary_energy_direct <- function(mode, allqueries, aggkeys, aggfn,
- years, filters, ounit)
+module.primary_energy_direct <- function(mode, allqueries, aggkeys, aggfn, years,
+ filters, filter_operator, ounit)
{
if(mode == GETQ) {
# Return titles of necessary queries
@@ -30,7 +30,7 @@ module.primary_energy_direct <- function(mode, allqueries, aggkeys, aggfn,
message('Function for processing variable: Primary Energy')
pe <- allqueries$'Primary Energy Consumption (Direct Equivalent)' %>%
dplyr::mutate(fuel = simplify_fuels(fuel))
- pe <- filter(pe, years, filters)
+ pe <- filter(pe, years, filters, filter_operator)
pe <- aggregate(pe, aggfn, aggkeys)
if(!is.na(ounit)) {
## skip unit conversion if output unit not specified.
diff --git a/R/runmodule.R b/R/runmodule.R
index 0489359..397d651 100644
--- a/R/runmodule.R
+++ b/R/runmodule.R
@@ -29,7 +29,7 @@
#' no unit conversion.
#' @keywords internal
runModule <- function(var, mode, allqueries=NULL, aggkeys=NULL, aggfn=NULL,
- years=NULL, filters=NULL, ounit=NULL)
+ years=NULL, filters=NULL, filter_operator=NULL, ounit=NULL)
{
fun <- tryCatch(
## Find the corresponding function, limited to the package environment
@@ -41,7 +41,7 @@ runModule <- function(var, mode, allqueries=NULL, aggkeys=NULL, aggfn=NULL,
},
finally = NULL
)
- fun(mode, allqueries, aggkeys, aggfn, years, filters, ounit)
+ fun(mode, allqueries, aggkeys, aggfn, years, filters, filter_operator, ounit)
}
@@ -68,7 +68,7 @@ canonicalForm <- function(var)
#'
#' @keywords internal
module.test_fun <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
if(mode == GETQ) {
"Test Query"
diff --git a/R/socioeconomics.R b/R/socioeconomics.R
index 99b4608..773109c 100644
--- a/R/socioeconomics.R
+++ b/R/socioeconomics.R
@@ -16,7 +16,7 @@
#' @keywords internal
module.population <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
if(mode == GETQ) {
# Return titles of necessary queries
@@ -27,7 +27,7 @@ module.population <- function(mode, allqueries, aggkeys, aggfn, years,
message('Function for processing variable: Population')
population <- allqueries$'Population'
- population <- filter(population, years, filters)
+ population <- filter(population, years, filters, filter_operator)
population <- aggregate(population, aggfn, aggkeys)
if(!is.na(ounit)) {
@@ -56,7 +56,7 @@ module.population <- function(mode, allqueries, aggkeys, aggfn, years,
#'
#' @keywords internal
module.gdp_mer_ <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
if(mode == GETQ) {
# Return titles of necessary queries
@@ -70,7 +70,7 @@ module.gdp_mer_ <- function(mode, allqueries, aggkeys, aggfn, years,
message('Function for processing variable: GDP MER')
gdp_mer <- allqueries$'GDP(MER)'
- gdp_mer <- filter(gdp_mer, years, filters)
+ gdp_mer <- filter(gdp_mer, years, filters, filter_operator)
gdp_mer <- aggregate(gdp_mer, aggfn, aggkeys)
if(grepl('US', ounit)) {
cf1 <- unitconv_counts(gdp_mer$Units[1], ounit)
@@ -101,7 +101,7 @@ module.gdp_mer_ <- function(mode, allqueries, aggkeys, aggfn, years,
#'
#' @keywords internal
module.pcgdp_ppp_ <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
if(mode == GETQ) {
# Return titles of necessary queries
@@ -115,7 +115,7 @@ module.pcgdp_ppp_ <- function(mode, allqueries, aggkeys, aggfn, years,
message('Function for processing variable: Per capita GDP PPP')
gdp_ppp <- allqueries$'pcGDP(PPP)'
- gdp_ppp <- filter(gdp_ppp, years, filters)
+ gdp_ppp <- filter(gdp_ppp, years, filters, filter_operator)
gdp_ppp <- aggregate(gdp_ppp, aggfn, aggkeys)
if(!is.na(ounit)) {
cf <- unitconv_usdollar(gdp_ppp$Units, ounit)
diff --git a/R/transportation.R b/R/transportation.R
index fbdf4ec..2602f6d 100644
--- a/R/transportation.R
+++ b/R/transportation.R
@@ -29,7 +29,7 @@ NULL
#' @describeIn trans_modules Passenger transportation service output data module
module.pass_trans_service_output <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
queries <- 'Transportation Service Output'
if(mode == GETQ) {
@@ -38,13 +38,13 @@ module.pass_trans_service_output <- function(mode, allqueries, aggkeys, aggfn, y
else {
allqueries <- trans_filter_svc(allqueries[queries], TRUE)
process.tr_svc_output(allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
}
}
#' @describeIn trans_modules Freight transportation service output data module
module.frgt_trans_service_output <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
queries <- 'Transportation Service Output'
if(mode == GETQ) {
@@ -53,13 +53,13 @@ module.frgt_trans_service_output <- function(mode, allqueries, aggkeys, aggfn, y
else {
allqueries <- trans_filter_svc(allqueries[queries], FALSE)
process.tr_svc_output(allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
}
}
#' @describeIn trans_modules Passenger transportation final energy module
module.pass_trans_final_energy <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
queries <- c('Transportation Final Energy', 'Refined Liquids')
if(mode == GETQ) {
@@ -70,13 +70,13 @@ module.pass_trans_final_energy <- function(mode, allqueries, aggkeys, aggfn, yea
transqueries <-
trans_filter_svc(allqueries['Transportation Final Energy'], TRUE)
allqueries <- c(transqueries, allqueries['Refined Liquids'])
- process.tr_fe_output(allqueries, aggkeys, aggfn, years, filters, ounit)
+ process.tr_fe_output(allqueries, aggkeys, aggfn, years, filters, filter_operator, ounit)
}
}
#' @describeIn trans_modules Freight transportation final energy module
module.frgt_trans_final_energy <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
queries <- c('Transportation Final Energy', 'Refined Liquids')
if(mode == GETQ) {
@@ -87,14 +87,14 @@ module.frgt_trans_final_energy <- function(mode, allqueries, aggkeys, aggfn, yea
transqueries <-
trans_filter_svc(allqueries['Transportation Final Energy'], FALSE)
allqueries <- c(transqueries, allqueries['Refined Liquids'])
- process.tr_fe_output(allqueries, aggkeys, aggfn, years, filters, ounit)
+ process.tr_fe_output(allqueries, aggkeys, aggfn, years, filters, filter_operator, ounit)
}
}
#' @describeIn trans_modules Passenger transportation service intensity module
module.pass_trans_service_intensity <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
queries <- c('Transportation Final Energy', 'Transportation Service Output',
'Refined Liquids')
@@ -109,7 +109,7 @@ module.pass_trans_service_intensity <- function(mode, allqueries, aggkeys, aggfn
## be filtered by service
transqueries <- trans_filter_svc(allqueries[queries[1:2]], TRUE)
allqueries <- c(transqueries, allqueries['Refined Liquids'])
- svc_intensity <- process.tr_svc_intensity(allqueries, aggkeys, aggfn, years, filters,
+ svc_intensity <- process.tr_svc_intensity(allqueries, aggkeys, aggfn, years, filters, filter_operator,
ounit, 'EJ / million pass-km')
if(is.na(ounit))
@@ -175,7 +175,7 @@ module.pass_trans_service_intensity <- function(mode, allqueries, aggkeys, aggfn
#' @describeIn trans_modules Passenger transportation service intensity module
module.frgt_trans_service_intensity <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
queries <- c('Transportation Final Energy', 'Transportation Service Output',
'Refined Liquids')
@@ -190,7 +190,7 @@ module.frgt_trans_service_intensity <- function(mode, allqueries, aggkeys, aggfn
## be filtered by service
transqueries <- trans_filter_svc(allqueries[queries[1:2]], FALSE)
allqueries <- c(transqueries, allqueries['Refined Liquids'])
- svc_intensity <- process.tr_svc_intensity(allqueries, aggkeys, aggfn, years, filters,
+ svc_intensity <- process.tr_svc_intensity(allqueries, aggkeys, aggfn, years, filters, filter_operator,
ounit, 'EJ / million tonne-km')
if(is.na(ounit))
@@ -232,7 +232,7 @@ module.frgt_trans_service_intensity <- function(mode, allqueries, aggkeys, aggfn
#' @describeIn trans_modules Passenger transportation load factor data module
module.pass_trans_load_factor <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
queries <- 'Transportation Load Factors'
if(mode == GETQ) {
@@ -244,7 +244,7 @@ module.pass_trans_load_factor <- function(mode, allqueries, aggkeys, aggfn, year
## as "load / veh", but "load" actually has some kind of unit, probably
## "passengers"
allqueries[['Transportation Load Factors']]$Units <- 'pass / veh'
- process.trans_load_factors(allqueries, aggkeys, aggfn, years, filters,
+ process.trans_load_factors(allqueries, aggkeys, aggfn, years, filters, filter_operator,
ounit)
## no unit conversions for passenger load factors; passengers / vehicle
## is the only sensible unit.
@@ -253,7 +253,7 @@ module.pass_trans_load_factor <- function(mode, allqueries, aggkeys, aggfn, year
#' @describeIn trans_modules Freight transportation load factor data module
module.frgt_trans_load_factor <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
queries <- 'Transportation Load Factors'
if(mode == GETQ) {
@@ -268,7 +268,7 @@ module.frgt_trans_load_factor <- function(mode, allqueries, aggkeys, aggfn, year
## as "load / veh", but "load" actually has some kind of unit, probably
## "tonnes"
allqueries[['Transportation Load Factors']]$Units <- 'tonnes / veh'
- lf <- process.trans_load_factors(allqueries, aggkeys, aggfn, years, filters,
+ lf <- process.trans_load_factors(allqueries, aggkeys, aggfn, years, filters, filter_operator,
ounit)
if(!is.na(ounit)) {
cf <- unitconv_mass(lf$Units[1], ounit)
@@ -283,7 +283,7 @@ module.frgt_trans_load_factor <- function(mode, allqueries, aggkeys, aggfn, year
#' @describeIn trans_modules Worker function for transportation service output modules
process.tr_svc_output <- function(allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
## silence notes on package check
Units <- scenario <- region <- year <- technology <- vintage <- service <-
@@ -295,7 +295,7 @@ process.tr_svc_output <- function(allqueries, aggkeys, aggfn, years,
dplyr::group_by(Units, scenario, region, year, technology, vintage, service, mode, submode) %>%
dplyr::summarise(value=sum(value)) %>%
dplyr::ungroup()
- serviceOutput <- filter(serviceOutput, years, filters)
+ serviceOutput <- filter(serviceOutput, years, filters, filter_operator)
serviceOutput <- aggregate(serviceOutput, aggfn, aggkeys)
## units example: million p-km
@@ -311,7 +311,7 @@ process.tr_svc_output <- function(allqueries, aggkeys, aggfn, years,
#' @describeIn trans_modules Worker function for service output modules
process.tr_fe_output <- function(allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
## silence notes on package checks
Units <- scenario <- region <- year <- technology <- vintage <- fuel <-
@@ -326,7 +326,7 @@ process.tr_fe_output <- function(allqueries, aggkeys, aggfn, years,
dplyr::group_by(Units, scenario, region, year, technology, vintage, fuel, liquid_type, service, mode, submode) %>%
dplyr::summarise(value=sum(value)) %>%
dplyr::ungroup()
- energy <- filter(energy, years, filters)
+ energy <- filter(energy, years, filters, filter_operator)
energy <- aggregate(energy, aggfn, aggkeys)
## units example: EJ/yr
if(!is.na(ounit)) {
@@ -341,7 +341,7 @@ process.tr_fe_output <- function(allqueries, aggkeys, aggfn, years,
#' @describeIn trans_modules Worker function for load factor modules
process.trans_load_factors <- function(allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
## silence notes on package check
Units <- scenario <- region <- year <- technology <- service <- submode <-
@@ -354,7 +354,7 @@ process.trans_load_factors <- function(allqueries, aggkeys, aggfn, years,
dplyr::group_by(Units, scenario, region, year, technology, service, mode, submode) %>% # average over LHDT
dplyr::summarise(value=mean(value)) %>%
dplyr::ungroup()
- ldfctr <- filter(ldfctr, years, filters)
+ ldfctr <- filter(ldfctr, years, filters, filter_operator)
ldfctr <- aggregate(ldfctr, aggfn, aggkeys)
## We don't do any unit conversion here because the allowable conversions
## will differ between passenger and freight services.
@@ -364,7 +364,7 @@ process.trans_load_factors <- function(allqueries, aggkeys, aggfn, years,
#' @describeIn trans_modules Worker function for transportation service
#' intensity
process.tr_svc_intensity <- function(allqueries, aggkeys, aggfn, years,
- filters, ounit, nativeunit)
+ filters, filter_operator, ounit, nativeunit)
{
## silence notes on package check
Units <- scenario <- region <- year <- service <- submode <- value <-
@@ -399,7 +399,7 @@ process.tr_svc_intensity <- function(allqueries, aggkeys, aggfn, years,
dplyr::inner_join(serviceOutput,
by = c('scenario', 'region', 'year', 'service', 'mode',
'submode')) %>%
- filter(years, filters) %>%
+ filter(years, filters, filter_operator) %>%
aggregate(aggfn, aggkeys, multiple=TRUE) %>%
## Calculate service intensity as energy / service output
dplyr::rename(energy=value.x, svc=value.y) %>%
@@ -413,7 +413,7 @@ process.tr_svc_intensity <- function(allqueries, aggkeys, aggfn, years,
#'
#' This module appears to be incomplete.
module.sales <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
queries <- c('Transportation Service Output', 'Transportation Load Factors')
if(mode == GETQ) {
@@ -456,7 +456,7 @@ module.sales <- function(mode, allqueries, aggkeys, aggfn, years,
dplyr::rename(value=sales) %>%
dplyr::mutate(Units = 'million vehicles')
- sales <- filter(sales, years, filters)
+ sales <- filter(sales, years, filters, filter_operator)
sales <- aggregate(sales, aggfn, aggkeys)
## units example: million p-km
if(!is.na(ounit)) {
@@ -550,7 +550,7 @@ mapfuel <- function(en, ref = NULL) {
#'
#' @keywords internal
module.transportation_pm_emissions <- function(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
{
if(mode == GETQ) {
# Return titles of necessary queries
@@ -595,7 +595,7 @@ module.transportation_pm_emissions <- function(mode, allqueries, aggkeys, aggfn,
dplyr::select(-pmfac, -Units.x, -vkm, -Units.y) %>%
dplyr::rename(value=pm_emissions)
- pm <- filter(pm, years, filters)
+ pm <- filter(pm, years, filters, filter_operator)
pm <- aggregate(pm, aggfn, aggkeys)
if(!is.na(ounit)) {
cf <- unitconv_mass(pm$Units[1], ounit)
diff --git a/error_tech.txt b/error_tech.txt
new file mode 100644
index 0000000..79830c8
--- /dev/null
+++ b/error_tech.txt
@@ -0,0 +1,40 @@
+Processing scenario: Reference-No-policy-med
+Database scenarios: Reference-No-policy-med
+Function for processing variable: Population
+Function for processing variable: Per capita GDP PPP
+Function for processing variable: Electricity
+Function for processing variable: Electricity
+Function for processing variable: Electricity
+Function for processing variable: Electricity
+Function for processing variable: Air pollution precursor emissions
+Error in `$<-.data.frame`(`*tmp*`, scenario, value = "reference") :
+ replacement has 1 row, data has 0
+In addition: Warning messages:
+1: In miquery_post(results, query, scenarios, regions, warn.empty) :
+ Query returned empty table:
+query: GHG emissions by technology
+scenarios: Reference-No-policy-med
+regions:
+ Hide Traceback
+
+ Rerun with Debug
+ Error in `$<-.data.frame`(`*tmp*`, scenario, value = "reference") :
+ replacement has 1 row, data has 0
+6.
+stop(sprintf(ngettext(N, "replacement has %d row, data has %d",
+ "replacement has %d rows, data has %d"), N, nrows), domain = NA)
+5.
+`$<-.data.frame`(`*tmp*`, scenario, value = "reference") at mcl.R#216
+4.
+`$<-`(`*tmp*`, scenario, value = "reference") at mcl.R#216
+3.
+FUN(X[[i]], ...)
+2.
+lapply(rslts[[scen]], function(vardf) {
+ vardf$scenario <- scen
+ vardf
+}) at mcl.R#215
+1.
+generate("example-scenario.ctl", "example-iiasa-variable.ctl",
+ "C:/Users/katmm/Research/GCAM_User_Package_fawcett_science/fawcett_science_workspace/output",
+ fileformat = "CSV")
\ No newline at end of file
diff --git a/inst/extdata/default-queries.xml b/inst/extdata/default-queries.xml
index 0a3098f..263d6ad 100644
--- a/inst/extdata/default-queries.xml
+++ b/inst/extdata/default-queries.xml
@@ -37,7 +37,7 @@
physical-output[@vintage]
*[@type = 'sector' and ((@name='electricity' or @name='elect_td_bld' or @name='industrial energy use'))]//*[@type = 'subsector']//*[@type = 'technology' and not (@name='elect_td_bld')]/*[@type='output' (:collapse:) and (@name='electricity' or @name='elect_td_bld')]/physical-output/node()
-
+
@@ -85,7 +85,7 @@
-
+
subsector
emissions
*[@type = 'sector' ]/*[@type='subsector']//CO2/emissions/node()
@@ -93,6 +93,744 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GHG
+ emissions
+ *[@type = 'sector' (:collapse:) or @type = 'resource' (: collapse :)]//*[@type = 'GHG']/emissions/node()
+
+
+
+
+
+
+ technology
+ emissions
+
+
+
+
+
+
+
+
+
+ sector
+ emissions
+
+
+
+
+
+
+
+ sector
+ emissions
+
+
+
+
+
+
+
+ sector
+ emissions
+
+
+
+
+
+
+
+ sector
+ emissions
+
+
+
+
+
+
+
+ sector
+ emissions
+
+
+
+
+
+
+
+ sector
+ emissions
+
+
+
+
+
+
+
+ sector
+ emissions
+
+
+
+
+
+
+
+ sector
+ emissions
+
+
+
+
+
+
+
+ subsector
+ emissions
+ *[@type = 'sector' ]/*[@type='subsector']//CO2/emissions/node()
+
+
+
+
+
+
+ sector
+ demand-physical[@vintage]
+ *[@type='sector' and ((@name='building' or @name='industry' or @name='transportation') or (exists(child::keyword/@final-energy)))]//*[@type='input' (: collapse :) and not(@name='trn_pass_road' or @name='limestone' or @name='process heat cement' or @name='industrial energy use' or @name='industrial feedstocks' or @name='renewable')]/demand-physical[@unit='EJ']/node()
+
+
+
+
+
+
+ input[@name]
+ demand-physical[@vintage]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -288,4 +1026,5 @@
+
diff --git a/inst/extdata/example-iiasa-variable.ctl b/inst/extdata/example-iiasa-variable.ctl
index 2cfcaf3..97fe081 100644
--- a/inst/extdata/example-iiasa-variable.ctl
+++ b/inst/extdata/example-iiasa-variable.ctl
@@ -1,7 +1,8 @@
-GCAM variable,output variable,aggregation keys,aggregation function,years,filters,output units
-Population,Population,,,2000:2050,,thous
-pcGDP(PPP),GDP|PPP,,,2000:2050,,Thous80US$/per
-Electricity,Electricity|Generation,,,2000:2050,(matches; sector; electricity),MWh
-Electricity,Electricity|Total,,,2000:2050,,
-Electricity,Electricity|Rooftop PV,,,2000:2050,(matches; sector; elect_td_bld),MWh
-Electricity,Electricity|Rooftop PV|Ridiculous,,,2000:2050,"(notmatches; sector; electricity), (notmatches; sector; industrial energy use)",MWh
\ No newline at end of file
+GCAM variable,output variable,aggregation keys,aggregation function,years,filters,filter_operator,output units
+Population,Population,,,2000:2050,,,thous
+pcGDP(PPP),GDP|PPP,,,2000:2050,,,Thous80US$/per
+Electricity,Electricity|Generation,,,2000:2050,(matches; sector; electricity),,MWh
+Electricity,Electricity|Total,,,2000:2050,,,
+Electricity,Electricity|Rooftop PV,,,2000:2050,(matches; sector; elect_td_bld),,MWh
+Electricity,Electricity|Rooftop PV|Ridiculous,,,2000:2050,"(notmatches; sector; electricity), (notmatches; sector; industrial energy use)",,MWh
+air_pollution,Emissions|BC|Energy|Demand|Transportation,,,2000:2050,"(matches; subsector; Domestic Aviation),(matches; subsector; International Aviation)","OR",Tg
diff --git a/man/filter.Rd b/man/filter.Rd
index 61cc7e9..a9109e4 100644
--- a/man/filter.Rd
+++ b/man/filter.Rd
@@ -4,7 +4,7 @@
\alias{filter}
\title{Filter an output variable}
\usage{
-filter(tbl, years, filterstr)
+filter(tbl, years, filterstr, filter_operator)
}
\arguments{
\item{tbl}{Table to filter}
diff --git a/man/module.co2_emissions.Rd b/man/module.co2_emissions.Rd
index aedb22a..e537a0a 100644
--- a/man/module.co2_emissions.Rd
+++ b/man/module.co2_emissions.Rd
@@ -2,14 +2,12 @@
% Please edit documentation in R/emissions.R
\name{module.co2_emissions}
\alias{module.co2_emissions}
-\title{CO2 emissions Data Module}
+\title{Emissions Data Module}
\usage{
-module.co2_emissions(mode, allqueries, aggkeys, aggfn, years, filters, ounit)
+module.co2_emissions(mode, allqueries, aggkeys, aggfn, years, filters,
+ filter_operator, ounit)
}
\description{
-Produce CO2 emissions
-}
-\details{
The raw table used by this module has columns:
\itemize{
\item{scenario}
diff --git a/man/module.electricity.Rd b/man/module.electricity.Rd
index 8c2e878..2ead639 100644
--- a/man/module.electricity.Rd
+++ b/man/module.electricity.Rd
@@ -4,7 +4,8 @@
\alias{module.electricity}
\title{Electricity Data Module}
\usage{
-module.electricity(mode, allqueries, aggkeys, aggfn, years, filters, ounit)
+module.electricity(mode, allqueries, aggkeys, aggfn, years, filters,
+ filter_operator, ounit)
}
\description{
Produce electricity by region.
diff --git a/man/module.gdp_mer_.Rd b/man/module.gdp_mer_.Rd
index 4770877..e65cdb8 100644
--- a/man/module.gdp_mer_.Rd
+++ b/man/module.gdp_mer_.Rd
@@ -4,7 +4,8 @@
\alias{module.gdp_mer_}
\title{GDP MER Data Module}
\usage{
-module.gdp_mer_(mode, allqueries, aggkeys, aggfn, years, filters, ounit)
+module.gdp_mer_(mode, allqueries, aggkeys, aggfn, years, filters,
+ filter_operator, ounit)
}
\description{
Produce GDP MER by region.
diff --git a/man/module.pcgdp_ppp_.Rd b/man/module.pcgdp_ppp_.Rd
index db4ad00..d068f77 100644
--- a/man/module.pcgdp_ppp_.Rd
+++ b/man/module.pcgdp_ppp_.Rd
@@ -4,7 +4,8 @@
\alias{module.pcgdp_ppp_}
\title{Per capita GDP PPP Data Module}
\usage{
-module.pcgdp_ppp_(mode, allqueries, aggkeys, aggfn, years, filters, ounit)
+module.pcgdp_ppp_(mode, allqueries, aggkeys, aggfn, years, filters,
+ filter_operator, ounit)
}
\description{
Produce GDP PPP by region.
diff --git a/man/module.population.Rd b/man/module.population.Rd
index d6f2862..62642ed 100644
--- a/man/module.population.Rd
+++ b/man/module.population.Rd
@@ -4,7 +4,8 @@
\alias{module.population}
\title{Population Data Module}
\usage{
-module.population(mode, allqueries, aggkeys, aggfn, years, filters, ounit)
+module.population(mode, allqueries, aggkeys, aggfn, years, filters,
+ filter_operator, ounit)
}
\description{
Produce population by region.
diff --git a/man/module.primary_energy_direct.Rd b/man/module.primary_energy_direct.Rd
index 73fd39b..c418f38 100644
--- a/man/module.primary_energy_direct.Rd
+++ b/man/module.primary_energy_direct.Rd
@@ -5,7 +5,7 @@
\title{Primary Energy (Direct Equivalent) Data Module}
\usage{
module.primary_energy_direct(mode, allqueries, aggkeys, aggfn, years, filters,
- ounit)
+ filter_operator, ounit)
}
\description{
Produce primary energy by fuel
diff --git a/man/module.test_fun.Rd b/man/module.test_fun.Rd
index 4040087..db248d2 100644
--- a/man/module.test_fun.Rd
+++ b/man/module.test_fun.Rd
@@ -4,7 +4,8 @@
\alias{module.test_fun}
\title{Test function for runModule}
\usage{
-module.test_fun(mode, allqueries, aggkeys, aggfn, years, filters, ounit)
+module.test_fun(mode, allqueries, aggkeys, aggfn, years, filters,
+ filter_operator, ounit)
}
\description{
This function prints a diagnostic and returns an empty data frame.
diff --git a/man/module.transportation_pm_emissions.Rd b/man/module.transportation_pm_emissions.Rd
index b731063..dd2bb2d 100644
--- a/man/module.transportation_pm_emissions.Rd
+++ b/man/module.transportation_pm_emissions.Rd
@@ -5,7 +5,7 @@
\title{Produce particulate matter emissions from transportation}
\usage{
module.transportation_pm_emissions(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
}
\description{
Convert service output in passenger-km or tonne-km to vehicle-km using the
diff --git a/man/runModule.Rd b/man/runModule.Rd
index f4ce15e..be9cf9f 100644
--- a/man/runModule.Rd
+++ b/man/runModule.Rd
@@ -5,7 +5,7 @@
\title{Run a data module}
\usage{
runModule(var, mode, allqueries = NULL, aggkeys = NULL, aggfn = NULL,
- years = NULL, filters = NULL, ounit = NULL)
+ years = NULL, filters = NULL, filter_operator = NULL, ounit = NULL)
}
\arguments{
\item{var}{Name of the variable to produce. This must be one of the varibles
diff --git a/man/trans_modules.Rd b/man/trans_modules.Rd
index f563d78..a3816b1 100644
--- a/man/trans_modules.Rd
+++ b/man/trans_modules.Rd
@@ -18,39 +18,43 @@
\title{Transportation data modules}
\usage{
module.pass_trans_service_output(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
module.frgt_trans_service_output(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
module.pass_trans_final_energy(mode, allqueries, aggkeys, aggfn, years, filters,
- ounit)
+ filter_operator, ounit)
module.frgt_trans_final_energy(mode, allqueries, aggkeys, aggfn, years, filters,
- ounit)
+ filter_operator, ounit)
module.pass_trans_service_intensity(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
module.frgt_trans_service_intensity(mode, allqueries, aggkeys, aggfn, years,
- filters, ounit)
+ filters, filter_operator, ounit)
module.pass_trans_load_factor(mode, allqueries, aggkeys, aggfn, years, filters,
- ounit)
+ filter_operator, ounit)
module.frgt_trans_load_factor(mode, allqueries, aggkeys, aggfn, years, filters,
- ounit)
+ filter_operator, ounit)
-process.tr_svc_output(allqueries, aggkeys, aggfn, years, filters, ounit)
+process.tr_svc_output(allqueries, aggkeys, aggfn, years, filters,
+ filter_operator, ounit)
-process.tr_fe_output(allqueries, aggkeys, aggfn, years, filters, ounit)
+process.tr_fe_output(allqueries, aggkeys, aggfn, years, filters,
+ filter_operator, ounit)
-process.trans_load_factors(allqueries, aggkeys, aggfn, years, filters, ounit)
+process.trans_load_factors(allqueries, aggkeys, aggfn, years, filters,
+ filter_operator, ounit)
-process.tr_svc_intensity(allqueries, aggkeys, aggfn, years, filters, ounit,
- nativeunit)
+process.tr_svc_intensity(allqueries, aggkeys, aggfn, years, filters,
+ filter_operator, ounit, nativeunit)
-module.sales(mode, allqueries, aggkeys, aggfn, years, filters, ounit)
+module.sales(mode, allqueries, aggkeys, aggfn, years, filters, filter_operator,
+ ounit)
}
\arguments{
\item{mode}{Either \code{GETQ} or \code{RUN}. The former returns
diff --git a/tests/testthat/test-data/BCbysubsectorq.rda b/tests/testthat/test-data/BCbysubsectorq.rda
new file mode 100644
index 0000000..406b219
Binary files /dev/null and b/tests/testthat/test-data/BCbysubsectorq.rda differ
diff --git a/tests/testthat/test-data/CH4bysubsectorq.rda b/tests/testthat/test-data/CH4bysubsectorq.rda
new file mode 100644
index 0000000..47c386f
Binary files /dev/null and b/tests/testthat/test-data/CH4bysubsectorq.rda differ
diff --git a/tests/testthat/test-data/CO2bysubsectorq.rda b/tests/testthat/test-data/CO2bysubsectorq.rda
new file mode 100644
index 0000000..2229c46
Binary files /dev/null and b/tests/testthat/test-data/CO2bysubsectorq.rda differ
diff --git a/tests/testthat/test-data/CObysubsectorq.rda b/tests/testthat/test-data/CObysubsectorq.rda
new file mode 100644
index 0000000..682322a
Binary files /dev/null and b/tests/testthat/test-data/CObysubsectorq.rda differ
diff --git a/tests/testthat/test-data/GHGbyregionq.rda b/tests/testthat/test-data/GHGbyregionq.rda
new file mode 100644
index 0000000..54eda76
Binary files /dev/null and b/tests/testthat/test-data/GHGbyregionq.rda differ
diff --git a/tests/testthat/test-data/GHGbytechq.rda b/tests/testthat/test-data/GHGbytechq.rda
new file mode 100644
index 0000000..1084542
Binary files /dev/null and b/tests/testthat/test-data/GHGbytechq.rda differ
diff --git a/tests/testthat/test-data/NH3bysubsectorq.rda b/tests/testthat/test-data/NH3bysubsectorq.rda
new file mode 100644
index 0000000..49f4d3e
Binary files /dev/null and b/tests/testthat/test-data/NH3bysubsectorq.rda differ
diff --git a/tests/testthat/test-data/NMVOCbysubsectorq.rda b/tests/testthat/test-data/NMVOCbysubsectorq.rda
new file mode 100644
index 0000000..8f60441
Binary files /dev/null and b/tests/testthat/test-data/NMVOCbysubsectorq.rda differ
diff --git a/tests/testthat/test-data/NOxbysubsectorq.rda b/tests/testthat/test-data/NOxbysubsectorq.rda
new file mode 100644
index 0000000..1ff602a
Binary files /dev/null and b/tests/testthat/test-data/NOxbysubsectorq.rda differ
diff --git a/tests/testthat/test-data/OCbysubsectorq.rda b/tests/testthat/test-data/OCbysubsectorq.rda
new file mode 100644
index 0000000..a0da556
Binary files /dev/null and b/tests/testthat/test-data/OCbysubsectorq.rda differ
diff --git a/tests/testthat/test-data/SO2bysubsectorq.rda b/tests/testthat/test-data/SO2bysubsectorq.rda
new file mode 100644
index 0000000..2328c4f
Binary files /dev/null and b/tests/testthat/test-data/SO2bysubsectorq.rda differ
diff --git a/tests/testthat/test-electricity.R b/tests/testthat/test-electricity.R
index 167b287..a49c54a 100644
--- a/tests/testthat/test-electricity.R
+++ b/tests/testthat/test-electricity.R
@@ -21,8 +21,9 @@ test_that('Electricity module produces electricity data.', {
aggfn <- NA
years <- '2000:2050'
filters <- NA
+ filter_operator <- NA
ounit <- NA
- expect_identical(module.electricity(iamrpt:::RUN, queries, aggkeys, aggfn,
- years, filters, ounit),
+ expect_identical(module.electricity(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
expected_result)
})
diff --git a/tests/testthat/test-emissions.R b/tests/testthat/test-emissions.R
new file mode 100644
index 0000000..13c5a62
--- /dev/null
+++ b/tests/testthat/test-emissions.R
@@ -0,0 +1,91 @@
+context('Emissions module')
+load('test-data/BCbysubsectorq.rda')
+load('test-data/CH4bysubsectorq.rda')
+load('test-data/CObysubsectorq.rda')
+load('test-data/CO2bysubsectorq.rda')
+load('test-data/GHGbyregionq.rda')
+load('test-data/GHGbytechq.rda')
+load('test-data/NH3bysubsectorq.rda')
+load('test-data/NMVOCbysubsectorq.rda')
+load('test-data/NOxbysubsectorq.rda')
+load('test-data/OCbysubsectorq.rda')
+load('test-data/SO2bysubsectorq.rda')
+
+queries <- list(BCbysubsectorq,
+ CH4bysubsectorq,
+ CObysubsectorq,
+ CO2bysubsectorq,
+ GHGbyregionq,
+ GHGbytechq,
+ NH3bysubsectorq,
+ NMVOCbysubsectorq,
+ NOxbysubsectorq,
+ OCbysubsectorq,
+ SO2bysubsectorq)
+queries <- stats::setNames(queries, c("BC emissions by subsector",
+ "CH4 emissions by subsector",
+ "CO emissions by subsector",
+ "CO2 emissions by subsector",
+ "GHG emissions by region",
+ "GHG emissions by technology",
+ "NH3 emissions by subsector",
+ "NMVOC emissions by subsector",
+ "NOx emissions by subsector",
+ "OC emissions by subsector",
+ "SO2 emissions by subsector"))
+
+test_that('GETQ Mode returns correct query titles', {
+ expect_match(module.bc_emissions_by_subsector(iamrpt:::GETQ), 'BC emissions by subsector')
+ expect_match(module.ch4_emissions_by_subsector(iamrpt:::GETQ), 'CH4 emissions by subsector')
+ expect_match(module.co_emissions_by_subsector(iamrpt:::GETQ), 'CO emissions by subsector')
+ expect_match(module.co2_emissions_by_subsector(iamrpt:::GETQ), 'CO2 emissions by subsector')
+ expect_match(module.ghg_emissions_by_region(iamrpt:::GETQ), 'GHG emissions by region')
+ expect_match(module.ghg_emissions_by_technology(iamrpt:::GETQ), 'GHG emissions by technology')
+ expect_match(module.nh3_emissions_by_subsector(iamrpt:::GETQ), 'NH3 emissions by subsector')
+ expect_match(module.nmvoc_emissions_by_subsector(iamrpt:::GETQ), 'NMVOC emissions by subsector')
+ expect_match(module.nox_emissions_by_subsector(iamrpt:::GETQ), 'NOx emissions by subsector')
+ expect_match(module.oc_emissions_by_subsector(iamrpt:::GETQ), 'OC emissions by subsector')
+ expect_match(module.so2_emissions_by_subsector(iamrpt:::GETQ), 'SO2 emissions by subsector')
+})
+
+test_that('Emissions modules produces emissions data.', {
+ aggkeys <- NA
+ aggfn <- NA
+ years <- '2000:2050'
+ filters <- NA
+ filter_operator <- NA
+ ounit <- NA
+ expect_identical(module.bc_emissions_by_subsector(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`BC emissions by subsector`, year>=2000, year<=2050))
+ expect_identical(module.ch4_emissions_by_subsector(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`CH4 emissions by subsector`, year>=2000, year<=2050))
+ expect_identical(module.co_emissions_by_subsector(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`CO emissions by subsector`, year>=2000, year<=2050))
+ expect_identical(module.co2_emissions_by_subsector(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`CO2 emissions by subsector`, year>=2000, year<=2050))
+ expect_identical(module.ghg_emissions_by_region(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`GHG emissions by region`, year>=2000, year<=2050))
+ expect_identical(module.ghg_emissions_by_technology(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`GHG emissions by technology`, year>=2000, year<=2050))
+ expect_identical(module.nh3_emissions_by_subsector(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`NH3 emissions by subsector`, year>=2000, year<=2050))
+ expect_identical(module.nmvoc_emissions_by_subsector(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`NMVOC emissions by subsector`, year>=2000, year<=2050))
+ expect_identical(module.nox_emissions_by_subsector(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`NOx emissions by subsector`, year>=2000, year<=2050))
+ expect_identical(module.oc_emissions_by_subsector(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`OC emissions by subsector`, year>=2000, year<=2050))
+ expect_identical(module.so2_emissions_by_subsector(iamrpt:::RUN, queries , aggkeys, aggfn,
+ years, filters, filter_operator, ounit),
+ dplyr::filter(queries$`SO2 emissions by subsector`, year>=2000, year<=2050))
+})
diff --git a/tests/testthat/test-socioeconomics.R b/tests/testthat/test-socioeconomics.R
index 2000073..ecdb316 100644
--- a/tests/testthat/test-socioeconomics.R
+++ b/tests/testthat/test-socioeconomics.R
@@ -20,18 +20,20 @@ test_that('Socioeconomics models produce data', {
aggfn <- NA
years <- '2000:2050'
filters <- NA
+ filter_operator <- NA
## All of these should be passing in the original unit, just to
## make sure that unit conversion runs
expect_identical(module.population(iamrpt:::RUN, queries, aggkeys,
- aggfn, years, filters,
+ aggfn, years, filters, filter_operator,
'thous'),
dplyr::filter(queries$Population, year>=2000, year<=2050))
expect_identical(module.gdp_mer_(iamrpt:::RUN, queries , aggkeys,
- aggfn, years, filters, 'Million1990US$'),
+ aggfn, years, filters, filter_operator,
+ 'Million1990US$'),
dplyr::filter(queries$`GDP(MER)`, year>=2000, year<=2050))
expect_identical(module.pcgdp_ppp_(iamrpt:::RUN, queries ,
- aggkeys, aggfn, years, filters,
+ aggkeys, aggfn, years, filters, filter_operator,
'Thous80US$/per'),
dplyr::filter(queries$`pcGDP(PPP)`, year>=2000, year<=2050))
@@ -40,7 +42,7 @@ test_that('Socioeconomics models produce data', {
## TODO: we should test at least one unit converison on each
## module.
popmil <- module.population(iamrpt:::RUN, queries , aggkeys,
- aggfn, years, filters, 'millions')
+ aggfn, years, filters, filter_operator, 'millions')
popqmil <- dplyr::filter(queries$Population, year>=2000,
year<=2050)
popqmil <- dplyr::mutate(popqmil, value = 1e-3*value)
diff --git a/tests/testthat/test-transportation.R b/tests/testthat/test-transportation.R
index 9245643..ab7821d 100644
--- a/tests/testthat/test-transportation.R
+++ b/tests/testthat/test-transportation.R
@@ -48,25 +48,26 @@ test_that('Transportation models return transportation data', {
aggfn <- NA
years <- '2000:2050'
filters <- NA
+ filter_operator <- NA
expect_equal(
module.pass_trans_service_output(RUN, queries, aggkeys, aggfn, years,
- filters, 'million pass-km'),
+ filters, filter_operator, 'million pass-km'),
dplyr::filter(service_norm, year>=2000, year<=2050, service=='Passenger'))
expect_equal(
module.frgt_trans_service_output(RUN, queries, aggkeys, aggfn, years,
- filters, 'million tonne-km'),
+ filters, filter_operator, 'million tonne-km'),
dplyr::filter(service_norm, year>=2000, year<=2050, service=='Freight'))
## These modules should be able to change the count
expect_equal(
module.pass_trans_service_output(RUN, queries, aggkeys, aggfn, years,
- filters, 'thousand pass-km') %>%
+ filters, filter_operator, 'thousand pass-km') %>%
dplyr::mutate(value=signif(value,3)),
dplyr::filter(service_norm, year>=2000, year<=2050,
service=='Passenger') %>%
dplyr::mutate(value=signif(value*1000,3), Units='thousand pass-km'))
expect_equal(
module.frgt_trans_service_output(RUN, queries, aggkeys, aggfn, years,
- filters, 'billion tonne-km') %>%
+ filters, filter_operator, 'billion tonne-km') %>%
dplyr::mutate(value=signif(value,3)),
dplyr::filter(service_norm, year>=2000, year<=2050,
service=='Freight') %>%
@@ -74,18 +75,18 @@ test_that('Transportation models return transportation data', {
expect_equal(module.pass_trans_load_factor(RUN, queries , aggkeys,
- aggfn, years, filters,
+ aggfn, years, filters, filter_operator,
'pass / veh'),
dplyr::filter(load_norm, year>=2000, year<=2050, service=='Passenger'))
expect_equal(module.frgt_trans_load_factor(RUN, queries , aggkeys,
- aggfn, years, filters,
+ aggfn, years, filters, filter_operator,
'tonnes / veh'),
dplyr::filter(load_norm, year>=2000, year<=2050,
service=='Freight'))
## Freight should be able to convert mass units. Passenger doesn't do any
## unit conversion.
expect_equal(module.frgt_trans_load_factor(RUN, queries , aggkeys,
- aggfn, years, filters,
+ aggfn, years, filters, filter_operator,
'kt / veh'),
dplyr::filter(load_norm, year>=2000, year<=2050,
service=='Freight') %>%
@@ -93,21 +94,21 @@ test_that('Transportation models return transportation data', {
expect_equal(module.pass_trans_final_energy(RUN, queries, aggkeys, aggfn, years,
- filters, 'EJ'),
+ filters, filter_operator, 'EJ'),
dplyr::filter(energy_norm, year>=2000, year<=2050,
service=='Passenger'))
expect_equal(module.frgt_trans_final_energy(RUN, queries, aggkeys, aggfn, years,
- filters, 'EJ'),
+ filters, filter_operator, 'EJ'),
dplyr::filter(energy_norm, year>=2000, year<=2050,
service=='Freight'))
## Both of these should be able to convert energy units
expect_equal(module.pass_trans_final_energy(RUN, queries, aggkeys, aggfn, years,
- filters, 'TJ'),
+ filters, filter_operator, 'TJ'),
dplyr::filter(energy_norm, year>=2000, year<=2050,
service=='Passenger') %>%
dplyr::mutate(value=1e6*value, Units='TJ'))
expect_equal(module.frgt_trans_final_energy(RUN, queries, aggkeys, aggfn, years,
- filters, 'TJ'),
+ filters, filter_operator, 'TJ'),
dplyr::filter(energy_norm, year>=2000, year<=2050,
service=='Freight') %>%
dplyr::mutate(value=1e6*value, Units='TJ'))
@@ -115,23 +116,23 @@ test_that('Transportation models return transportation data', {
expect_equal(module.pass_trans_service_intensity(RUN, queries, aggkeys, aggfn,
- years, filters, 'EJ / million pass-km'),
+ years, filters, filter_operator, 'EJ / million pass-km'),
dplyr::filter(intensity_norm, year>=2000, year<=2050,
service=='Passenger'))
expect_equal(module.frgt_trans_service_intensity(RUN, queries, aggkeys, aggfn,
- years, filters,
+ years, filters, filter_operator,
'EJ / million tonne-km'),
dplyr::filter(intensity_norm, year>=2000, year<=2050,
service=='Freight'))
## should be able to convert energy counts, and for freight, mass
expect_equal(module.pass_trans_service_intensity(RUN, queries, aggkeys, aggfn,
- years, filters, 'TJ / thous pass-km'),
+ years, filters, filter_operator, 'TJ / thous pass-km'),
dplyr::filter(intensity_norm, year>=2000, year<=2050,
service=='Passenger') %>%
dplyr::mutate(value=1e3*value,
Units='TJ / thous pass-km'))
expect_equal(module.frgt_trans_service_intensity(RUN, queries, aggkeys, aggfn,
- years, filters,
+ years, filters, filter_operator,
'EJ / Mt-km'),
dplyr::filter(intensity_norm, year>=2000, year<=2050,
service=='Freight') %>%
@@ -139,38 +140,40 @@ test_that('Transportation models return transportation data', {
# "Mt" are the same.
- expect_warning(module.sales(RUN, queries, aggkeys, aggfn, years, filters,
+ expect_warning(module.sales(RUN, queries, aggkeys, aggfn, years, filters, filter_operator,
NA))
## expect_equal(module.transportation_pm_emissions(RUN, queries, aggkeys, aggfn, years,
## filters, 'g'),
## dplyr::filter(pm_norm, year>=2000, year<=2050))
expect_warning(module.transportation_pm_emissions(RUN, queries, aggkeys, aggfn, years,
- filters, 'g'))
+ filters, filter_operator, 'g'))
years <- NA
ounit <- NA
filters <- '(==; region;India), (==; service;Freight), (==;mode;Road), (==;submode;LHDT)'
- expect_equal(module.frgt_trans_service_output(RUN, queries , aggkeys, aggfn, years, filters, ounit),
+ filter_operator <- 'AND'
+ expect_equal(module.frgt_trans_service_output(RUN, queries , aggkeys, aggfn, years, filters, filter_operator, ounit),
dplyr::filter(service_norm, service=='Freight', mode=='Road', submode=='LHDT'))
- expect_equal(module.frgt_trans_load_factor(RUN, queries , aggkeys, aggfn, years, filters, ounit),
+ expect_equal(module.frgt_trans_load_factor(RUN, queries , aggkeys, aggfn, years, filters, filter_operator, ounit),
dplyr::filter(load_norm, service=='Freight', mode=='Road', submode=='LHDT'))
- expect_equal(module.frgt_trans_final_energy(RUN, queries , aggkeys, aggfn, years, filters, ounit),
+ expect_equal(module.frgt_trans_final_energy(RUN, queries , aggkeys, aggfn, years, filters, filter_operator, ounit),
dplyr::filter(energy_norm, service=='Freight', mode=='Road', submode=='LHDT'))
- expect_equal(module.frgt_trans_service_intensity(RUN, queries , aggkeys, aggfn, years, filters, ounit),
+ expect_equal(module.frgt_trans_service_intensity(RUN, queries , aggkeys, aggfn, years, filters, filter_operator, ounit),
dplyr::filter(intensity_norm, service=='Freight', mode=='Road', submode=='LHDT'))
## expect_equal(module.transportation_pm_emissions(RUN, queries, aggkeys, aggfn, years, filters, ounit),
## dplyr::filter(pm_norm, service=='Freight', mode=='Road', submode=='LHDT'))
filters <- '(==; region;India), (==;service;Passenger), (==;mode;Road), (==;submode;4W), (==;fuel;Electricity)'
+ filter_operator <- 'AND'
expect_equal(module.pass_trans_final_energy(RUN, queries , aggkeys,
- aggfn, years, filters,
+ aggfn, years, filters, filter_operator,
ounit),
dplyr::filter(energy_norm, service=='Passenger',
mode=='Road', submode=='4W',
fuel=='Electricity'))
expect_equal(module.pass_trans_service_intensity(RUN, queries ,
aggkeys, aggfn,
- years, filters,
+ years, filters, filter_operator,
ounit),
dplyr::filter(intensity_norm, service=='Passenger',
mode=='Road', submode=='4W',
diff --git a/tests/testthat/test_filtering.R b/tests/testthat/test_filtering.R
index 911f406..2d9f913 100644
--- a/tests/testthat/test_filtering.R
+++ b/tests/testthat/test_filtering.R
@@ -1,12 +1,13 @@
context('Filtering output variables')
-load('test-data/popq.rda') # loads the popq data frame
+load('test-data/popq.rda') # loads the popq data frame
+load('test-data/electricityq.rda') # loads the electricityq data frame
test_that('Filtering with no filters is a no-op', {
- popf <- filter(popq, NA, NA)
+ popf <- filter(popq, NA, NA, NA)
expect_identical(popq, popf)
- popf <- filter(popq, '', '')
+ popf <- filter(popq, '', '', '')
expect_identical(popq, popf)
})
@@ -20,25 +21,25 @@ test_that('Year specifications parse correctly.', {
})
test_that('Start and end years are applied correctly', {
- popf <- filter(popq, '2000:2100', NA)
+ popf <- filter(popq, '2000:2100', NA, NA)
expect_identical(popf, dplyr::filter(popq, year >= 2000))
- popf <- filter(popq, '1975:2050', NA)
+ popf <- filter(popq, '1975:2050', NA, NA)
expect_identical(popf, dplyr::filter(popq, year <= 2050))
- popf <- filter(popq, '2000:2050:5', NA)
+ popf <- filter(popq, '2000:2050:5', NA, NA)
expect_identical(popf, dplyr::filter(popq, year >= 2000, year <= 2050,
year %% 5 == 0))
})
test_that('The == filter works', {
- popf <- filter(popq, NA, '(==; region; USA)')
+ popf <- filter(popq, NA, '(==; region; USA)', NA)
expect_identical(popf, dplyr::filter(popq, region == 'USA'))
})
test_that('The != filter works', {
- popf <- filter(popq, NA, '(!=; region; USA)')
+ popf <- filter(popq, NA, '(!=; region; USA)', NA)
expect_identical(popf, dplyr::filter(popq, region != 'USA'))
})
@@ -47,7 +48,7 @@ test_that('Numeric filters work', {
for(op in c('<', '>', '<=', '>=')) {
testval <- 117670 # close to median but actually exists in the table
filterstr <- paste0('( ', op, '; value; ', testval, ' )')
- popf <- filter(popq, NA, filterstr)
+ popf <- filter(popq, NA, filterstr, NA)
dpfilt <- lazyeval::interp(~ oper(value, testval), oper = as.name(op))
expect_identical(popf, dplyr::filter_(popq, dpfilt),
info=paste('filter is not equivalent to dplyr::filter for op= ',
@@ -57,33 +58,33 @@ test_that('Numeric filters work', {
test_that('Regex filters work', {
popqf <- dplyr::filter(popq, grepl('Africa', region))
- popf <- filter(popq, NA, '(matches; region; Africa)')
+ popf <- filter(popq, NA, '(matches; region; Africa)', NA)
expect_identical(popf, popqf)
- popf <- filter(popq, NA, '(matches; region; africa)')
+ popf <- filter(popq, NA, '(matches; region; africa)', NA)
expect_equal(nrow(popf), 0) # No regions with lower case "africa"
- popf <- filter(popq, NA, '(matchesi; region; africa)')
+ popf <- filter(popq, NA, '(matchesi; region; africa)', NA)
expect_identical(popf, popqf) # case-insensitive match should work
popqf <- dplyr::filter(popq, !grepl('Africa', region))
- popf <- filter(popq, NA, '(notmatches; region; Africa)')
+ popf <- filter(popq, NA, '(notmatches; region; Africa)', NA)
expect_identical(popf, popqf)
- popf <- filter(popq, NA, '(notmatches; region; africa)')
+ popf <- filter(popq, NA, '(notmatches; region; africa)', NA)
expect_identical(popf, popq) # all regions fail to match lower case
- popf <- filter(popq, NA, '(notmatchesi; region; africa)')
+ popf <- filter(popq, NA, '(notmatchesi; region; africa)', NA)
expect_identical(popf, popqf)
})
-test_that('Multiple filters work', {
- popf <- filter(popq, NA, '(matches; region; Africa), (<=; value; 227757), (>=; value; 152801)')
+test_that('Multiple filters work with "AND" filter operator', {
+ popf <- filter(popq, NA, '(matches; region; Africa), (<=; value; 227757), (>=; value; 152801)', 'AND')
expect_identical(popf, dplyr::filter(popq, grepl('Africa', region), value <= 227757, value >= 152801))
})
-test_that('Filter options work when all used together', {
- popf <- filter(popq, '2000:2050:5', '(matches; region; Africa), (<=; value; 227757), (>=; value; 152801)')
+test_that('Filter options work when all used together with "AND" filter operator', {
+ popf <- filter(popq, '2000:2050:5', '(matches; region; Africa), (<=; value; 227757), (>=; value; 152801)', 'AND')
expect_identical(popf,
dplyr::filter(popq,
grepl('Africa', region),
@@ -95,14 +96,41 @@ test_that('Filter options work when all used together', {
})
test_that('Malformed filter string gives a warning and gets skipped', {
- expect_warning({popf <- filter(popq, '2000:2050', 'matches region Africa')},
+ expect_warning({popf <- filter(popq, '2000:2050', 'matches region Africa', NA)},
'matches region Africa')
expect_identical(popf, dplyr::filter(popq, year >= 2000, year <= 2050))
})
-
-test_that("One malformed filter doesn't affect good filters.", {
- expect_warning({popf <- filter(popq, NA, '(matches; region; Africa, (<; value; 227757)')},
+test_that("One malformed filter doesn't affect good filters with AND filter operator.", {
+ expect_warning({popf <- filter(popq, NA, '(matches; region; Africa, (<; value; 227757)', 'AND')},
'\\(matches; region; Africa')
expect_identical(popf, dplyr::filter(popq, value < 227757))
})
+
+test_that('Multiple filters work with "OR" filter operator', {
+ popf <- filter(popq, NA, '(matches; region; Africa_Eastern), (matches; region; Brazil)', 'OR')
+ expect_identical(popf, rbind(dplyr::filter(popq, region=='Africa_Eastern'), dplyr::filter(popq, region=='Brazil')))
+})
+
+test_that('Malformed filter operator string gives a warning and is set to "AND"', {
+ expect_warning({popf <- filter(popq, NA,
+ '(matches; region; Africa), (<=; value; 227757), (>=; value; 152801)', 'Goop')},
+ 'Goop')
+ expect_identical(popf, dplyr::filter(popq, grepl('Africa', region), value <= 227757, value >= 152801))
+})
+
+test_that('Missing filter operator string gives a warning and is set to "AND"', {
+ expect_warning({popf <- filter(popq, NA,
+ '(matches; region; Africa), (<=; value; 227757), (>=; value; 152801)', NA)},
+ 'not provided')
+ expect_identical(popf, dplyr::filter(popq, grepl('Africa', region), value <= 227757, value >= 152801))
+})
+
+test_that('Multiple filters work with "AND,OR" filter operator', {
+ electricityf <- filter(electricityq, NA,
+ '(matches; sector; electricity), (matches; subsector; biomass), (matches; subsector; coal)', 'AND,OR')
+ expect_equal(electricityf,
+ rbind(dplyr::filter(electricityq, sector=='electricity', subsector=='biomass'),
+ dplyr::filter(electricityq, sector=='electricity', subsector=='coal')))
+})
+