From 1f14254e20dc3902f563d09fb1697955593ea316 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Sat, 28 Jul 2018 19:34:58 +0200
Subject: [PATCH] Extend all utility functions to accept arrays and general
 lists of mortalityTable objects. The list/array structure should be
 preseved...

---
 R/utilityFunctions.R         | 40 ++++++++++++++++++++++++++++--------
 R/whittaker.mortalityTable.R |  2 ++
 2 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R
index 14831df..1c9f767 100644
--- a/R/utilityFunctions.R
+++ b/R/utilityFunctions.R
@@ -75,12 +75,14 @@ fitExpExtrapolation = function(data, idx, up = TRUE, verbose = FALSE) {
 
 
 #' @export
-mT.setName = function(table, name = table@name) {
+mT.setName = function(table, name) {
     if (is.array(table)) {
         return(array(
             lapply(table, mT.setName, name = name),
             dim = dim(table), dimnames = dimnames(table))
         )
+    } else if (is.list(table)) {
+        return(lapply(table, mT.setName, name = name))
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -98,6 +100,8 @@ mT.fillAges = function(table, neededAges, fill = 0) {
             lapply(table, mT.fillAges, neededAges = neededAges, fill = fill),
             dim = dim(table), dimnames = dimnames(table))
         )
+    } else if (is.list(table)) {
+        return(lapply(table, mT.fillAges, neededAges = neededAges, fill = fill))
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -121,17 +125,24 @@ mT.fillAges = function(table, neededAges, fill = 0) {
 }
 
 #' @export
-mT.scaleProbs = function(table, factor = 1.0, name.postfix = "scaled", name = paste(table@name, name.postfix)) {
+mT.scaleProbs = function(table, factor = 1.0, name.postfix = "scaled", name = NULL) {
     if (is.array(table)) {
         return(array(
             lapply(table, mT.scaleProbs, factor = factor, name.postfix = name.postfix, name = name),
             dim = dim(table), dimnames = dimnames(table))
         )
+    } else if (is.list(table)) {
+        return(lapply(table, mT.scaleProbs, factor = factor, name.postfix = name.postfix, name = name))
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
 
     table@deathProbs = factor * table@deathProbs
+    if (is.null(name)) {
+        if (!is.null(name.postfix)) {
+            name = paste(table@name, name.postfix)
+        }
+    }
     if (!is.null(name)) {
         table@name = name
     }
@@ -140,20 +151,22 @@ mT.scaleProbs = function(table, factor = 1.0, name.postfix = "scaled", name = pa
 
 
 #' @export
-mT.setTrend = function(table, trend, trendages = ages(table), baseYear = table@baseYear, dampingFunction = identity) {
+mT.setTrend = function(table, trend, trendages = NULL, baseYear = NULL, dampingFunction = identity) {
     if (is.array(table)) {
         return(array(
             lapply(table, mT.setTrend, trend = trend, trendages = trendages, baseYear = baseYear, dampingFunction = dampingFunction),
             dim = dim(table), dimnames = dimnames(table))
         )
+    } else if (is.list(table)) {
+        return(lapply(table, mT.setTrend, trend = trend, trendages = trendages, baseYear = baseYear, dampingFunction = dampingFunction))
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
 
     t = mortalityTable.trendProjection(
         table,
-        baseYear = baseYear,
-        trend = trend[match(table@ages, trendages)],
+        baseYear = if (is.null(baseYear)) table@baseYear else baseYear,
+        trend = trend[match(table@ages, if (is.null(trendages)) ages(table) else trendages)],
         dampingFunction = dampingFunction
     )
     t
@@ -171,32 +184,38 @@ mT.extrapolateTrendExp = function(table, idx, up = TRUE) {
             lapply(table, mT.extrapolateTrendExp, idx = idx, up = up),
             dim = dim(table), dimnames = dimnames(table))
         )
+    } else if (is.list(table)) {
+        return(lapply(table, mT.extrapolateTrendExp, idx = idx, up = up))
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
 
     if (.hasSlot(table, "trend") && !is.null(table@trend))
         table@trend = fitExpExtrapolation(table@trend, idx = idx,up = up)
-    if (.hasSlot(table, "tren2") && !is.null(table@trend2))
+    if (.hasSlot(table, "trend2") && !is.null(table@trend2))
         table@trend2 = fitExpExtrapolation(table@trend2, idx = idx,up = up)
     table
 }
 
 
 #' @export
-mT.translate = function(table, baseYear, name = table@name) {
+mT.translate = function(table, baseYear, name = NULL) {
     if (is.array(table)) {
         return(array(
             lapply(table, mT.translate, baseYear = baseYear, name = name),
             dim = dim(table), dimnames = dimnames(table))
         )
+    } else if (is.list(table)) {
+        return(lapply(table, mT.translate, baseYear = baseYear, name = name))
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
 
     table@deathProbs = periodDeathProbabilities(table, Period = baseYear)
     table@baseYear = baseYear
-    table@name = name
+    if (!is.null(name)) {
+        table@name = name
+    }
     table
 }
 
@@ -208,6 +227,8 @@ mT.extrapolateProbsExp = function(table, age, up = TRUE) {
             lapply(table, mT.extrapolateProbsExp, age = age, up = up),
             dim = dim(table), dimnames = dimnames(table))
         )
+    } else if (is.list(table)) {
+        return(lapply(table, mT.extrapolateProbsExp, age = age, up = up))
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -272,6 +293,8 @@ mT.setDimInfo = function(table, ..., append = TRUE) {
             lapply(table, mT.setDimInfo, ..., append = append),
             dim = dim(table), dimnames = dimnames(table))
         )
+    } else if (is.list(table)) {
+        return(lapply(table, mT.setDimInfo, ..., append = append))
     }
     if (!is(table, "mortalityTable"))
         stop("First argument must be a mortalityTable or a list of mortalityTable objects.")
@@ -303,3 +326,4 @@ pT.getSubTable = function(table, subtable = "qx") {
     else
         NULL
 }
+
diff --git a/R/whittaker.mortalityTable.R b/R/whittaker.mortalityTable.R
index de80049..736ad03 100644
--- a/R/whittaker.mortalityTable.R
+++ b/R/whittaker.mortalityTable.R
@@ -72,6 +72,8 @@ whittaker.mortalityTable = function(table, lambda = 10, d = 2, name.postfix = ",
             lapply(table, whittaker.mortalityTable, lambda = lambda, d = d, name.postfix = name.postfix, ..., weights = weights, log = log),
             dim = dim(table), dimnames = dimnames(table))
         )
+    } else if (is.list(table)) {
+        return(lapply(table, whittaker.mortalityTable, lambda = lambda, d = d, name.postfix = name.postfix, ..., weights = weights, log = log))
     }
     if (!is(table, "mortalityTable")) {
         stop("Table object must be an instance (or list of instances) of mortalityTable in whittaker.mortalityTable.")
-- 
GitLab