Ответ 1
new.env
имеет аргумент parent
, по умолчанию - parent.frame()
- то есть вызывающий. Другими словами, ваша новая среда наследует весь материал из вашей текущей среды.
Вы можете избежать этого, указав parent
:
new.env(parent = baseenv())
Или, если вы хотите наследовать загруженные пакеты:
new.env(parent = as.environment(2))
И да, документация render
несколько вводит в заблуждение: в то время как new.env()
предоставляет новую, пустую среду, ее не полностью отделяет от вызывающего, а вызывающий абонент, вероятно, почти никогда не хочет использовать только new.env()
.
Чтобы иметь возможность использовать пакеты внутри чистой среды, унаследованной от baseenv()
, вам необходимо вручную реализовать механизм вложения пакетов, поскольку пакеты R не поддерживают изолирование среды самостоятельно (grrr!). Или вы используете "modules" пакет, который поддерживает локально прикрепленные пакеты:
```{r}
modules::import_package('ggplot2', attach = TRUE)
qplot(rnorm(10))
```
Аргумент attach = TRUE
приводит к локальному подключению пакета, в отличие от library
.
Здесь есть урезанная версия кода загрузки "modules" , который может быть использован:
require_namespace = function (package) {
ns = .Internal(getRegisteredNamespace(package))
if (is.null(ns))
ns = tryCatch(loadNamespace(package), error = identity)
ns
}
exhibit_package_namespace = function (namespace, name, parent, export_list) {
structure(list2env(sapply(export_list, getExportedValue, ns = namespace,
simplify = FALSE),
parent = parent.env(parent)),
name = paste('package', name, sep = ':'),
path = getNamespaceInfo(namespace, 'path'))
}
library_local = function (package, parent = parent.frame()) {
pkg_ns = require_namespace(package)
if (inherits(pkg_ns, 'error'))
stop('Unable to load package ', sQuote(package), '\n',
'Failed with error: ', sQuote(conditionMessage(pkg_ns)))
export_list = getNamespaceExports(pkg_ns)
pkg_env = exhibit_package_namespace(pkg_ns, package, parent, export_list)
parent.env(parent) = pkg_env
}
Использование:
```{r}
library_local('ggplot2')
qplot(rnorm(10))
```