diff --git a/R/qenv-class.R b/R/qenv-class.R index 4b2a24ccf..552082850 100644 --- a/R/qenv-class.R +++ b/R/qenv-class.R @@ -31,19 +31,12 @@ setMethod( "initialize", "qenv", function(.Object, .xData, code = list(), ...) { # nolint: object_name. - mask_env <- new.env(parent = parent.env(.GlobalEnv)) - mask_env$library <- function(...) { - x <- library(...) - if (!identical(parent.env(mask_env), parent.env(.GlobalEnv))) { - parent.env(mask_env) <- parent.env(.GlobalEnv) - } - invisible(x) - } + parent <- parent.env(.GlobalEnv) new_xdata <- if (rlang::is_missing(.xData)) { - new.env(parent = mask_env) + new.env(parent = parent) } else { checkmate::assert_environment(.xData) - rlang::env_clone(.xData, parent = mask_env) + rlang::env_clone(.xData, parent = parent) } lockEnvironment(new_xdata, bindings = TRUE) diff --git a/R/qenv-eval_code.R b/R/qenv-eval_code.R index 94136cc53..49b90abae 100644 --- a/R/qenv-eval_code.R +++ b/R/qenv-eval_code.R @@ -49,12 +49,22 @@ setMethod("eval_code", signature = c(object = "qenv.error"), function(object, co object@.xData <- rlang::env_clone(object@.xData, parent = parent.env(object@.xData)) parsed_code <- parse(text = code, keep.source = TRUE) + old <- evaluate::inject_funs( + library = function(...) { + x <- library(...) + if (!identical(parent.env(object@.xData), parent.env(.GlobalEnv))) { + parent.env(object@.xData) <- parent.env(.GlobalEnv) + } + invisible(x) + } + ) out <- evaluate::evaluate( code, envir = object@.xData, stop_on_error = 1, output_handler = evaluate::new_output_handler(value = identity) ) + evaluate::inject_funs(old) # remove library() override new_code <- list() for (this in out) {