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'))) +}) +