From 3c64a96b4798d9adcdb5b71f35c9e6965153bd60 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Sun, 18 Aug 2019 19:22:29 +0200
Subject: [PATCH] Properly handle NA values in all utility functions

-) Handle NA values in all utility functions
-) Provide AT population forecast as array
-) Fix AVOe1999-R
---
 R/utilityFunctions.R                          | 24 +++++++++++++++++++
 R/whittaker.mortalityTable.R                  |  2 ++
 ...talityTables_Austria_Annuities_AVOe1996R.R |  2 +-
 ...rtalityTables_Austria_PopulationForecast.R | 11 +++++++++
 4 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R
index 2e33569..b7c3335 100644
--- a/R/utilityFunctions.R
+++ b/R/utilityFunctions.R
@@ -98,6 +98,8 @@ mT.setName = function(table, name) {
         )
     } else if (is.list(table)) {
         return(lapply(table, mT.setName, name = name))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -128,6 +130,8 @@ mT.fillAges = function(table, neededAges, fill = 0) {
         )
     } else if (is.list(table)) {
         return(lapply(table, mT.fillAges, neededAges = neededAges, fill = fill))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -172,6 +176,8 @@ mT.scaleProbs = function(table, factor = 1.0, name.postfix = "scaled", name = NU
         )
     } else if (is.list(table)) {
         return(lapply(table, mT.scaleProbs, factor = factor, name.postfix = name.postfix, name = name))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -206,6 +212,8 @@ mT.setTrend = function(table, trend, trendages = NULL, baseYear = NULL, dampingF
         )
     } else if (is.list(table)) {
         return(lapply(table, mT.setTrend, trend = trend, trendages = trendages, baseYear = baseYear, dampingFunction = dampingFunction))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -233,6 +241,8 @@ mT.extrapolateTrendExp = function(table, idx, up = TRUE) {
         )
     } else if (is.list(table)) {
         return(lapply(table, mT.extrapolateTrendExp, idx = idx, up = up))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -254,6 +264,8 @@ mT.translate = function(table, baseYear, name = NULL) {
         )
     } else if (is.list(table)) {
         return(lapply(table, mT.translate, baseYear = baseYear, name = name))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -276,6 +288,8 @@ mT.extrapolateProbsExp = function(table, age, up = TRUE) {
         )
     } else if (is.list(table)) {
         return(lapply(table, mT.extrapolateProbsExp, age = age, up = up))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -348,6 +362,8 @@ pT.setDimInfo = function(table, ..., append = TRUE) {
         )
     } else if (is.list(table)) {
         return(lapply(table, pT.setDimInfo, ..., append = append))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "pensionTable"))
         stop("First argument must be a pensionTable or a list of pensionTable objects.")
@@ -382,6 +398,8 @@ mT.setDimInfo = function(table, ..., append = TRUE) {
         return(lapply(table, mT.setDimInfo, ..., append = append))
     } else if (is(table, "pensionTable")) {
         return(pT.setDimInfo(table, ..., append = append))
+    } else if (is.na(c(table))) {
+        return(table)
     }
 
     if (!is(table, "mortalityTable"))
@@ -405,6 +423,8 @@ pT.getSubTable = function(table, subtable = "qx") {
         )
     } else if (is.list(table)) {
         return(lapply(table, pT.getSubTable, subtable = subtable))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "pensionTable"))
         stop("First argument must be a pensionTable or a list of pensionTable objects.")
@@ -428,6 +448,8 @@ mT.switchover = function(table, to, at, weights = NULL) {
         )
     } else if (is.list(table)) {
         return(lapply(table, mT.switchover, to = to, at = at, weights = weights))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -581,6 +603,8 @@ pT.recalculateTotalMortality = function(object, ...) {
         )
     } else if (is.list(table)) {
         return(lapply(table, pT.recalculateTotalMortality, ...))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "pensionTable"))
         stop("First argument must be a pensionTable or a list of pensionTable objects.")
diff --git a/R/whittaker.mortalityTable.R b/R/whittaker.mortalityTable.R
index 736ad03..7861e2c 100644
--- a/R/whittaker.mortalityTable.R
+++ b/R/whittaker.mortalityTable.R
@@ -74,6 +74,8 @@ whittaker.mortalityTable = function(table, lambda = 10, d = 2, name.postfix = ",
         )
     } else if (is.list(table)) {
         return(lapply(table, whittaker.mortalityTable, lambda = lambda, d = d, name.postfix = name.postfix, ..., weights = weights, log = log))
+    } else if (is.na(c(table))) {
+        return(table)
     }
     if (!is(table, "mortalityTable")) {
         stop("Table object must be an instance (or list of instances) of mortalityTable in whittaker.mortalityTable.")
diff --git a/inst/extdata/MortalityTables_Austria_Annuities_AVOe1996R.R b/inst/extdata/MortalityTables_Austria_Annuities_AVOe1996R.R
index 3d93fb5..ae9c07e 100644
--- a/inst/extdata/MortalityTables_Austria_Annuities_AVOe1996R.R
+++ b/inst/extdata/MortalityTables_Austria_Annuities_AVOe1996R.R
@@ -95,7 +95,7 @@ AVOe1996R.female.av325 = mortalityTable.ageShift(
 
 AVOe1996R = array(
     data = c(mortalityTable.NA),
-    dim = c(2, 2, 2),
+    dim = c(2, 3),
     dimnames = list(Geschlecht = c("m", "w"), Collar = c("Einzel", "Gruppe", "AV"))
 )
 
diff --git a/inst/extdata/MortalityTables_Austria_PopulationForecast.R b/inst/extdata/MortalityTables_Austria_PopulationForecast.R
index e592689..586d7cc 100644
--- a/inst/extdata/MortalityTables_Austria_PopulationForecast.R
+++ b/inst/extdata/MortalityTables_Austria_PopulationForecast.R
@@ -30,6 +30,17 @@ mort.AT.forecast.female = mortalityTable.trendProjection(
     )
 )
 
+
+mort.AT.forecast = array(
+    data = c(mortalityTable.NA),
+    dim = c(2),
+    dimnames = list(Geschlecht = c("m", "w"))
+)
+mort.AT.forecast[["m"]] = mort.AT.forecast.male
+mort.AT.forecast[["w"]] = mort.AT.forecast.female
+
+
+
 rm(AT.pop.fc)
 
 ###############################################################################
-- 
GitLab