【问题标题】:How to change object from any environment?如何从任何环境更改对象?
【发布时间】:2022-01-26 09:50:32
【问题描述】:

我想在这段代码所在的环境中修改一些代码(或添加/删除)。我发现这个话题真的很有帮助:How to change on the fly a line of an existing function in R,但我遇到的问题是我要修改的功能不在.GlobalEnv 中,我不知道这个环境的名称是什么。

我正在考虑的这个环境可以描述为B 环境,来自我之前的一个问题的答案:What is an environment where exists all objects from all files sourced when running Shiny App?。所以基本上我想在 Shiny App 中更改一些代码。我设法使用environment() 函数找到了环境,但我发现我无法替换代码。

也许我的问题可以用这个代码来显示:

test <- function() 1

test()
#> [1] 1

environment(test)$test <- eval(parse(text = "function() 2"))

test()
#> [1] 1

.GlobalEnv$test <- eval(parse(text = "function() 3"))

test()
#> [1] 3

如何使这行代码:environment(test)$test &lt;- eval(parse(text = "function() 2")) 工作?即如何使用environment()更改对象?

@jpiversen 请允许我向您说明这个问题。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    问题在于在左侧多次使用 test 混淆了“R 版本 4.1.2 (2021-11-01)”中的 $&lt;- 以及可能的其他 R 版本。

    1) 一种解决方法是将分配分成两个语句。

    test <- function() 1
    
    test()
    ## [1] 1
    
    e <- environment(test)
    e$test <- eval(parse(text = "function() 2"))
    
    test()
    ## [1] 2
    

    2) 交替使用assign

    test <- function() 1
    
    test()
    ## [1] 1
    
    assign("test", eval(parse(text = "function() 2")), environment(test))
    
    test()
    ## [1] 2
    

    注意

    1. 如果我们使用function() 1function() 2 代替eval(parse(text = "function() 1"))eval(parse(text = "function() 2")),这些示例的工作原理相同。

    2. 这个问题或其变体也发布在 r-helpr-develr-bugs 上,在最后一个中,Luke Tierney 指出这是由于 $

    【讨论】:

    • 谢谢你这个详细的回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多