File: evaluateParamExpressions.R

package info (click to toggle)
r-cran-paramhelpers 1.14.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 992 kB
  • sloc: ansic: 102; sh: 13; makefile: 2
file content (90 lines) | stat: -rw-r--r-- 2,804 bytes parent folder | download
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
#' @title Evaluates all expressions within a parameter.
#'
#' @description Evaluates the expressions of a parameter, parameter set or list
#' of parameters for a given dictionary.
#'
#' @param obj ([Param()] | `ParamHelpers::ParamSet()` | `list`)\cr
#'   Parameter, parameter set or list of parameter values. Expressions within
#'   `len`, `lower` or `upper` boundaries, `default` or `values` will be
#'   evaluated using the provided dictionary (`dict`).
#' @template arg_dict
#' @return [[Param()] | `ParamHelpers::ParamSet()` | `list`].
#' @export
#' @examples
#' ps = makeParamSet(
#'   makeNumericParam("x", lower = expression(p), upper = expression(ceiling(3 * p))),
#'   makeIntegerParam("y", lower = 1, upper = 2)
#' )
#' evaluateParamExpressions(ps, dict = list(p = 3))
#'
#' ps = makeParamSet(
#'   makeNumericParam("x", default = expression(sum(data$Species == "setosa"))),
#'   makeIntegerParam("y", lower = 1, upper = 2),
#'   keys = c("data", "Species")
#' )
#' evaluateParamExpressions(ps, dict = list(data = iris))
#'
#' par.vals = list(
#'   x = expression(k),
#'   y = 5
#' )
#' evaluateParamExpressions(par.vals, dict = list(k = 3))
evaluateParamExpressions = function(obj, dict = NULL) {
  UseMethod("evaluateParamExpressions")
}

#' @export
evaluateParamExpressions.Param = function(obj, dict = NULL) {

  assertClass(obj, "Param")
  if (!hasExpression(obj)) {
    return(obj)
  }
  assertList(dict, names = "unique", null.ok = TRUE)
  # replace expressions in length (needs to be done prior to computing
  # defaults, values and boundaries)
  length = getParamLengths(par = obj, dict = dict)
  obj$len = asInt(length, na.ok = TRUE)

  # replace expressions in default, values and boundaries
  if (!is.null(obj$lower)) {
    obj$lower = unname(getLower(obj = obj, dict = dict))
  }
  if (!is.null(obj$upper)) {
    obj$upper = unname(getUpper(obj = obj, dict = dict))
  }
  if (!is.null(obj$default)) {
    obj$default = getDefaults(obj = obj, dict = dict)
  }
  if (!is.null(obj$values)) {
    obj$values = getValues(obj = obj, dict = dict)
  }
  return(obj)
}

#' @export
evaluateParamExpressions.ParamSet = function(obj, dict = NULL) {
  assertClass(obj, "ParamSet")
  if (!hasExpression(obj)) {
    return(obj)
  }
  assertList(dict, names = "unique", null.ok = TRUE)
  ids = names(obj$pars)
  # evaluate all parameters separately
  obj$pars = lapply(obj$pars, function(par) {
    evaluateParamExpressions(obj = par, dict = dict)
  })
  names(obj$pars) = ids
  return(obj)
}

#' @export
evaluateParamExpressions.list = function(obj, dict = NULL) {
  assertClass(obj, "list")
  assertList(dict, names = "unique", null.ok = TRUE)
  ids = names(obj)
  # evaluate all parameter values separately
  setNames(lapply(obj, function(par) {
    eval(expr = par, envir = dict)
  }), ids)
}