gpt4 book ai didi

r - 如何将列表与环境一起放置?

转载 作者:行者123 更新时间:2023-12-02 18:03:01 25 4
gpt4 key购买 nike

我正在开发一个函数,基本上可以从函数内部获取参数。它按预期工作,但是当我尝试传输结果时,列表中有一个 envir 。它通过dput输出正常,但我无法传输它。

> test(iris)
list(envir = <environment>, call = test(iris), fn.info = list(
fn = "test", dot.keys = NULL, dot.vals = NULL, params = list(
df = "iris"), map = list(df = "iris"), formals = list(
df = "--EMPTY--")))

如您所见,INTERNALS 获取 fn 函数名称和函数参数。捕获的一个元素是 envir,它很容易重现,如下所示:

dput( (envir = environment()) );

该列表至少捕获了环境,但是当我尝试将其粘贴回 session 中时,出现错误:

> x = list(envir = <environment>, call = test(iris), fn.info = list(
Error: unexpected '<' in "x = list(envir = <"
> fn = "test", dot.keys = NULL, dot.vals = NULL, params = list(
Error: unexpected ',' in " fn = "test","
> df = "iris"), map = list(df = "iris"), formals = list(
Error: unexpected ')' in " df = "iris")"
> df = "--EMPTY--")))
Error: unexpected ')' in " df = "--EMPTY--")"


理想情况下,我想要一对函数,将其作为字符串转换为 envir 或从 envir 转换,以便我可以传输它。

问题:如何通过 dput 传输环境?

env.toString(envir) {}

env.fromString(envir) {}

以上代表了我当前的路线图,但我愿意接受建议。我已经尝试过 as.characteras.rawas.hexmode ...我相信 deparse 内部会工作,但是如果没有建议 env.fromString

,这将使我无法将环境恢复为对象

最佳答案

正如您所注意到的,dput() 不提供重建环境所需的代码

env1 <- new.env()
env1$x <- "something"
env2 <- asNamespace("utils")
env3 <- .GlobalEnv
test <- list(env1, env2, env3, 1, "a")
dput(test)
#> list(<environment>, <environment>, <environment>, 1, "a")

环境的一个基本属性是它们有一个父环境,因此要重现一个环境,您可能必须重现其父环境,以及其父环境的父环境等。因此,不可能(或合理?)解决一般情况.

然而,某些环境在 R 中已经有一个名称,或者很容易使用 asNamespace() 进行调用,因此期望 dput() 能够做到这一点是合理的但事实并非如此。

{constructive} 包确实可以,并且可以通过在列表上使用 as.environment() 在更一般的情况下提供“有时足够好”的解决方案。

constructive::construct(test, check = FALSE)
#> list(as.environment(list(x = "something")), asNamespace("utils"), .GlobalEnv, 1, "a")

参数 check = FALSE 是为了防止失败,因为通过代码重新创建的对象与输入并不严格相同。

它很快就会出现在 CRAN 上,但同时: https://github.com/cynkra/constructive


实际上你可以尝试:

env.toString <- function (envir) {
sprintf("as.environment(%s)", paste(deparse(as.list(envir)), collapse = "\n"))
}

关于r - 如何将列表与环境一起放置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73914944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com