【问题标题】:meta-programming and the substitute function in RR中的元编程和替代函数
【发布时间】:2019-11-06 17:36:26
【问题描述】:
f <- function() {
  x <- 6 + 4
  substitute(x)
}
f()

上面会输出:

[1] 10

但是,以下:

x <- 6 + 4
substitute(x)

输出:

x

它们为什么不同?

【问题讨论】:

    标签: r metaprogramming substitution


    【解决方案1】:

    @akrun 的回答展示了 如何 解决问题,但我认为您的“为什么?” 问题的答案在 ?substitute 中,上面写着在详情中:

    如果是普通变量,则替换它的值,除非env 是.GlobalEnv,在这种情况下符号保持不变。

    (强调我的。)当您在默认提示 &gt; 上执行此操作时,您处于全局环境中。在您的第一个示例中,在函数的命名空间中并非如此。 (至于“为什么R-core会做出这种行为?”,我觉得我没有资格回答甚至推测。)

    【讨论】:

    • 我喜欢这样的问题的一个原因是……我事先并不知道这一点,也永远不会猜到这将是默认行为。这看起来很奇怪,但是几十年来有时具有向后兼容性要求的螺旋式开发会导致行为略有不一致。这可能是当时最好的选择(也许仍然是因为我不明白*耸耸肩*的原因)。
    • substitute(X, list(X = x)) 是一种常见的用法,在这里可以使用
    【解决方案2】:

    evaluation 没有发生

    eval(substitute(x))
    #[1] 10
    

    正如@r2evans 显示的文档描述,我们可以在新环境中对其进行测试以查看实际效果

    # create the object in another environment
    e1 <- new.env()
    e1$x <- 6 + 4
    substitute(x) # here x is looked in the global space
    #x
    substitute(x, env = e1) # specify the `env` and looks for the local env
    #[1] 10
    

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 2017-05-13
      • 2016-06-16
      • 2017-04-19
      相关资源
      最近更新 更多