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)
}
|