delayedAssign2: Delay Evaluation

delayedAssign2R Documentation

Delay Evaluation

Description

delayedAssign2 creates a promise to evaluate the given expression if its value is requested.

Usage

delayedAssign2(x, value, eval.env = parent.frame(),
    assign.env = parent.frame(), evaluated = TRUE)

Arguments

x

a variable name (given as a quoted string in the function call)

value

an expression to be assigned to x

eval.env

an environment in which to evaluate value

assign.env

an environment in which to assign x

evaluated

logical; should value be evaluated before making the promise?

Details

This function is built upon delayedAssign, with the extra argument evaluated. This is helpful in situations where an expression has already been grabbed with substitute somewhere else that you now wish to make into a promise.

While not implemented yet, this is used for the lazy default evaluation in ArgumentParser.

Value

NULL invisibly.

Examples

# this is a simplified version of what ArgumentParser does with its arguments.
# ArgumentParser hides many details that should be shown here


# make a list like ArgumentParser
args <- list()
add.argument <- function (name, default)
{
    args[[length(args) + 1]] <<-
        list(name = name, default = substitute(default))
    invisible()
}


# these would normally be added by 'ArgumentParser()$add.argument'
add.argument("--alpha", TRUE     )
add.argument("--beta" , `--alpha`)
add.argument("--gamma", `--alpha`)


# this would normally be the environment
# returned by 'ArgumentParser()$parse.args'
value <- new.env()


for (n in seq_along(args)) {


    # we have 'evaluated = TRUE' here because we don't want 'args[[n]]$default'
    # to be the expression of the promise, but whatever 'args[[n]]$default'
    # evaluates to
    delayedAssign2(args[[n]]$name, args[[n]]$default,
        eval.env = value, assign.env = value,
        evaluated = TRUE)


    # this part would normally be more complex to deal with things like
    # multiple names for 1 argument, 'type', 'choices',  and, of course,
    # providing arguments, but i only want to demonstrate 'delayedAssign2' here
}


# then we force evaluate each argument
for (n in seq_along(args)) {
    get(args[[n]]$name, envir = value, inherits = FALSE)
}


# these are all TRUE, could be all NA or FALSE if argument '--alpha=NA' or
# '--alpha=FALSE' was provided to the ArgumentParser
print(as.list(value, all.names = TRUE))

ArcadeAntics/essentials documentation built on Nov. 7, 2024, 4:33 p.m.