File: evaluateParamExpressions.R

package info (click to toggle)
r-cran-paramhelpers 1.12-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 984 kB
  • sloc: ansic: 260; sh: 13; makefile: 2
file content (84 lines) | stat: -rw-r--r-- 2,850 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
#' @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 [\code{\link{Param}} | \code{\link[ParamHelpers]{ParamSet}} | \code{list}]\cr
#'   Parameter, parameter set or list of parameter values. Expressions within \code{len},
#'   \code{lower} or \code{upper} boundaries, \code{default} or \code{values} will be
#'   evaluated using the provided dictionary (\code{dict}).
#' @template arg_dict
#' @return [\code{\link{Param}} | \code{\link[ParamHelpers]{ParamSet}} | \code{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)
}