【问题标题】:How to use trace() for function in parent or child environment?如何在父或子环境中使用 trace() 函数?
【发布时间】:2021-12-29 09:41:15
【问题描述】:

我想调试来自不同环境的函数,而不是我调用 trace()debug() 的环境,但我不知道如何引用这些函数。

fun1 <- function() {
  a <-  1
  a
}

fun2 <- function() {
  fun1 <- function(){
    b <- 2
    b
  }
  trace(fun1, browser, where = globalenv())
}

fun1()
fun2()
fun1()

上面我已经准备了示例,在子环境中我调用trace() 并希望将browser() 插入父环境中定义的函数中(在我的示例中 - 全局环境,但我正在寻找解决方案考虑到任何父环境)。

但是,在我的示例中,browser() 被插入到 fun1() 中,b 作为局部变量,所以不是我想要的函数。

总结一下:

  1. 如何使用trace()从任何父环境引用函数?祖父母、祖父母等也是如此。
  2. 是否也可以在父环境中引用 child 环境中的函数?如果是,该怎么做?

【问题讨论】:

    标签: r


    【解决方案1】:

    Duncan Murdoch 在 R-help Mailing List 上回答了这个问题。我在下面发布答案:

    您被正常的 R 范围界定所困扰。当fun2 正在执行时,如 只要它执行fun1 赋值,名称fun1 就会绑定到 本地函数,所以当你在trace() 的第一个参数中使用fun1 时, 你得到那个。它将忽略“where”参数,因为它是 传递了一个函数对象。如果您引用名称,则必须执行 查找,它将使用“where”。所以像这样写fun2

    fun2 <- function() {
       fun1 <- function(){
         b <- 2
         b
       }
       trace("fun1", browser, where = globalenv())
    }
    
    

    如何在子环境中引用父环境中的某些功能(不一定在全局环境中定义)?

    如果你想要一个 fun2 的调用者可见的函数。如果你想要一个功能 使用与 fun2 相同的环境定义,您通常可以使用 environment(fun2),或parent.env(environment())

    我可以在父环境中引用子环境中的某些功能吗?我猜不是,因为短暂性?

    有时可以,但通常不会。如果fun2 返回了一个值 参考评估框架,您将能够看到“b” fun1 的版本。但你的没有。这个会:

    fun2 <- function() {
       fun1 <- function(){
         b <- 2
         b
       }
       trace("fun1", browser, where = globalenv())
       environment()
    }
    
    

    现在如果您执行e &lt;- fun2(),您将在全局fun1 上设置跟踪,但是 e$fun1 将是本地的。

    来源:https://stat.ethz.ch/pipermail/r-help/2021-December/473434.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      相关资源
      最近更新 更多