Rserve.eval.Rd
Rserve.eval
evaluates a given expression in a way that is very
close to the behavior on the console Read/Evaluate/Print Loop (REPL).
Among other things this means printing the result of each expression
if visible. The function is guaranteed to not raise an error and in
case of an error it returns an object of class
Rserve-eval-error
with details including the error and the
stack trace.
Rserve.eval(what, where = .GlobalEnv, last.value = FALSE, exp.value = FALSE,
context = NULL, handlers = list(error=.save.condition))
expressions to evaluate
environment to evaluate in
logical, if TRUE
then the result of the
evaluation is returned, otherwise the evaluation is only performed
for its side-efects and returns TRUE
instead.
logical, it TRUE
then an error object will
include the actual expression that triggered the error, otherwise
it will only store the index of the expression in what
.
optional object that will be used as the Rserve context
for the duration of the evaluation
(see Rserve.context
).
optional named list of calling handlers to register
for the duration of the evaluation. The default is to register an
error
handlers which stores the error condition so it can
be reported in the result - see below.
If what
contains one or more expressions, they are evaluated
one by one while printing the result of each if visible. Upon error
subsequent expressions are not evaluated. If what
is not an
expression then the only a single evaluation of what
is
performed and the result is not printed.
The main purpose of this function is to implement console front-ends
where the front-end uses parse()
+ Rserve.eval()
to
simulate the action of a GUI. Because the function returns in all
circumstances it allows clients to rely on a well-define messaging
behavior.
If the evaluation triggered an error, the result is an object of class
Rserve-eval-error
with components:
character, error message
list of contexts in the traceback
if what
contains multiple expressions then
this will be either an index to the expression that caused the error
(exp.value=FALSE
) or the actual expression (otherwise).
current Rserve context, NULL
if none has been set
if any condition has been saved via
.save.condition
(which is the default) then on error the
captured condition object is stored here, NULL
otherwise
If the evaluation finished without an error then the result is either
TRUE
if last.value=FALSE
or the value of the last
expression otherwise.
Rserve versions up to 1.8-10 did not include the condition
component, no calling handlers were registered and there was no
condition
component in the result. To replicate that behavior
or if you don't need that information, you can set
handlers=NULL
which removes the overhead of adding calling
handlers.
No error checking is performed on the
handlers
parameter, so make sure it is avalid, named list of
functions, otherwise an error will occur at evaluation time.
g <- function() stop("foo")
f <- function() g()
(Rserve.eval(expression(f())))
#> $error
#> [1] "Error: could not find function \"f\"\n"
#>
#> $traceback
#> NULL
#>
#> $expression
#> [1] 1
#>
#> $context
#> NULL
#>
#> $condition
#> <simpleError: could not find function "f">
#>
#> attr(,"class")
#> [1] "Rserve-eval-error"
(Rserve.eval(parse(text="1:5\n1+1")))
#> [1] 1 2 3 4 5
#> [1] 2
#> [1] TRUE
(Rserve.eval(quote(1+1), last.value=TRUE))
#> [1] 2
error_with_condition = function(object = NULL) {
cond = errorCondition("this is a custom error with condition",
object = object,
class = "CustomError")
stop(cond)
}
str(Rserve.eval(quote(error_with_condition("hello")), last.value = TRUE))
#> Class 'Rserve-eval-error' hidden list of 5
#> $ error : chr "Error: could not find function \"error_with_condition\"\n"
#> $ traceback : NULL
#> $ expression: int NA
#> $ context : NULL
#> $ condition :List of 2
#> ..$ message: chr "could not find function \"error_with_condition\""
#> ..$ call : NULL
#> ..- attr(*, "class")= chr [1:3] "simpleError" "error" "condition"