aboutsummaryrefslogtreecommitdiff
path: root/R/gmkinws.R
blob: c6f1ec5917c019f126dd2b90cfe09dff2be84adc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# Copyright (C) 2015 Johannes Ranke
# Contact: jranke@uni-bremen.de

# This file is part of the R package gmkin

# mkin is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.

# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.

# You should have received a copy of the GNU General Public License along with
# this program. If not, see <http://www.gnu.org/licenses/>

#' A workspace class for gmkin
#'
#' @docType class
#' @importFrom R6 R6Class
#' @importFrom mkin mkinws
#' @export
#' @format An \code{\link{R6Class}} generator object.
#' @field observed Names of the observed variables in the datasets, named
#'   by the names used in the models contained in field m
#' @field ds A list of datasets compatible with mkinfit (long format)
#' @field ds.cur Index of the currently selected dataset
#' @field m A list of mkinmod models
#' @field m.cur Index of the currently selected model
#' @field f A list of mkinfit objects
#' @field f.cur Index of the currently selected fit
#' @field s The summaries of the mkinfit objects in field f

gmkinws <- R6Class("gmkinws", 
  public = list(
    observed = NULL,
    ds = list(),
    ds.cur = NULL,
    m = list(),
    m.cur = NULL,
    f = list(),
    f.cur = NULL,
    s = NA,

    initialize = function(ds, m, f, ds.cur = NA, m.cur = NA, f.cur = NA) {

      ## Datasets
      if (!missing(ds)) {
        self$check_ds(ds)
        self$ds = ds
        self$ds.cur = ds.cur

        # Collect names of observed variables
        self$observed <- unique(sapply(ds, function(x) x$observed))
      }

      ## Models
      if (!missing(m)) {
        self$check_m(m)
        self$m <- m
      }
      self$m.cur = m.cur

      ## Fits
      if (!missing(f)) {
        self$f <- f
      }
      self$f.cur = f.cur

      invisible(self)
    },

    check_ds = function(ds) {
      errmsg <- "ds must be a list of mkinds objects"
      if (!is.list(ds)) stop(errmsg)
      lapply(ds, function(x) {
        if (!is(x, "mkinds"))
          stop(errmsg)
        }
      )
    },

    add_ds = function(ds) {
      self$check_ds(ds)
      common_names = intersect(names(self$ds), names(ds))
      if (length(common_names) > 0) stop("Dataset name(s) ", paste(common_names, collapse = ", "), " already used.")
      else append(self$ds, ds)

      # Update names of observed variables
      observed <- unique(sapply(ds, function(x) x$observed))
      self$observed <- union(self$observed, observed)

      invisible(self)
    },

    check_m = function(m) {
      errmsg <- "m must be a list of mkinmod objects"
      if (!is.list(m)) stop(errmsg)
      lapply(m, function(x) {
        if (!is(x, "mkinmod"))
          stop(errmsg)
        }
      )
    },

    add_m = function(m) {
      self$check_m(m)
      common_names = intersect(names(self$m), names(m))
      if (length(common_names) > 0) stop("Model name(s) ", paste(common_names, collapse = ", "), " already used.")
      else self$m = c(self$m, m)
      invisible(self)
    }
  )   
)

#' @export
print.gmkinws <- function(x, ...) {
  cat("<gmkinws> workspace object\n")
  cat("\nDatasets:\n")
  print(x$ds)
  cat("\nModels:\n")
  print(x$m)
  cat("Current selections:\n")
  cat("Dataset ", x$ds.cur, ", Model ", x$m.cur, ", Fit ", x$f.cur, "\n", sep = "")
  cat("\nFits:\n")
  print(names(x$f))
}

Contact - Imprint