【问题标题】:Creating scoped expressions in R to clean intermediate variables [duplicate]在 R 中创建范围表达式以清理中间变量
【发布时间】:2017-10-01 12:08:53
【问题描述】:

这是在 R 中创建作用域表达式的合适方法,即封装命令,其变量在评估后被消除。

我现在使用的方式是使用with()

> with(data.frame(), {foo <- 5; bar <- 6; foo + bar})
[1] 11
> foo
Error: object 'foo' not found

但这显然是一个 hack。

(顺便说一句,如果您将c() 而不是data.frame() 传递给with(),则新变量实际上最终会出现在父环境中;不知道为什么)

【问题讨论】:

  • 我认为这在 R 中是不可能的。我不知道您的确切用例是什么,但通常人们会着手将代码重构为函数以避免创建大量临时变量。喜欢x &lt;- function() {foo &lt;- 5; bar &lt;- 6; foo + bar}; x()
  • 不确定您的意思,但您可以创建 Javascript 所称的“IIFE”,例如 (function(x){y=x+2;return(y)})(1) 不会留下 y 挂起。
  • 是的 spacedman,这就是我所需要的。 (function() {a
  • 建议的副本不相关。该问题的 OP 想要一个不受全局变量影响的函数的局部范围。我想即时评估内联一次性表达式,而不会将内容留在内存中
  • with(new.env(), {foo &lt;- 5; bar &lt;- 6; foo + bar}) 作为 data.frame() 的替代品

标签: r scope evaluation


【解决方案1】:

local({foo &lt;- 5; bar &lt;- 6; foo + bar})

local({foo <- 5 bar <- 6 foo + bar})

来自?local(我的重点)

local 在本地环境中计算表达式。它与 evalq 等价,只是它的默认参数创建了一个新的空环境。这对于创建匿名递归函数和一种有限的命名空间功能很有用,因为在环境中定义的变量从外部不可见

【讨论】:

    【解决方案2】:

    您可以使用match.callexpressioneval

    > no_effect <- function(...){
    +   .call <- match.call()
    +   .call[[1]] <- as.symbol("expression")
    +   expr <- eval(.call)
    +   
    +   eval(expr, list(), enclos = parent.frame())
    + }
    > 
    > no_effect({foo <- 5; bar <- 6; foo + bar})
    [1] 11
    > foo
    Error: object 'foo' not found
    

    解决方案与你已经写的很接近。

    【讨论】:

    • 很好的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2021-05-06
    相关资源
    最近更新 更多