qenv {teal.code} | R Documentation |
Code tracking with qenv
object
Description
Create a qenv
object and evaluate code in it to track code history.
Usage
qenv()
new_qenv(env = new.env(parent = parent.env(.GlobalEnv)), code = character())
eval_code(object, code)
get_code(object, deparse = TRUE, ...)
## S3 method for class 'qenv'
within(data, expr, ...)
Arguments
Details
qenv()
instantiates a qenv
with an empty environment.
Any changes must be made by evaluating code in it with eval_code
or within
, thereby ensuring reproducibility.
new_qenv()
( and not recommended)
can instantiate a qenv
object with data in the environment and code registered.
eval_code
evaluates given code in the qenv
environment and appends it to the code
slot.
Thus, if the qenv
had been instantiated empty, contents of the environment are always a result of the stored code.
get_code
retrieves the code stored in the qenv
. ...
passes arguments to methods.
within
is a convenience function for evaluating inline code inside the environment of a qenv
.
It is a method for the base
generic that wraps eval_code
to provide a simplified way of passing code.
within
accepts only inline expressions (both simple and compound) and allows for injecting values into expr
through the ...
argument:
as name:value
pairs are passed to ...
, name
in expr
will be replaced with value
.
Value
qenv
and new_qenv
return a qenv
object.
eval_code
returns a qenv
object with expr
evaluated or qenv.error
if evaluation fails.
get_code
returns the traced code (from @code
slot) in the form specified by deparse
.
within
returns a qenv
object with expr
evaluated or qenv.error
if evaluation fails.
Using language objects with within
Passing language objects to expr
is generally not intended but can be achieved with do.call
.
Only single expression
s will work and substitution is not available. See examples.
See Also
base::within()
, get_var()
, get_env()
, get_warnings()
, join()
, concat()
Examples
# create empty qenv
qenv()
# create qenv with data and code (deprecated)
new_qenv(env = list2env(list(a = 1)), code = quote(a <- 1))
new_qenv(env = list2env(list(a = 1)), code = parse(text = "a <- 1", keep.source = TRUE))
new_qenv(env = list2env(list(a = 1)), code = "a <- 1")
# evaluate code in qenv
q <- qenv()
q <- eval_code(q, "a <- 1")
q <- eval_code(q, quote(library(checkmate)))
q <- eval_code(q, expression(assert_number(a)))
# retrieve code
get_code(q)
get_code(q, deparse = FALSE)
# evaluate code using within
q <- qenv()
q <- within(q, {
i <- iris
})
q <- within(q, {
m <- mtcars
f <- faithful
})
q
get_code(q)
# inject values into code
q <- qenv()
q <- within(q, i <- iris)
within(q, print(dim(subset(i, Species == "virginica"))))
within(q, print(dim(subset(i, Species == species)))) # fails
within(q, print(dim(subset(i, Species == species))), species = "versicolor")
species_external <- "versicolor"
within(q, print(dim(subset(i, Species == species))), species = species_external)
# pass language objects
expr <- expression(i <- iris, m <- mtcars)
within(q, expr) # fails
do.call(within, list(q, expr))
exprlist <- list(expression(i <- iris), expression(m <- mtcars))
within(q, exprlist) # fails
do.call(within, list(q, do.call(c, exprlist)))