【问题标题】:Tracing functions in RR中的跟踪函数
【发布时间】:2018-10-07 13:35:10
【问题描述】:

我想跟踪一个函数,以便它在调用时打印它的所有参数 并在返回结果时将返回值与参数一起打印。 函数跟踪允许定义在进入和退出函数调用时要执行的操作。 是否有一个函数返回函数内的参数列表,是否有一种方法可以在不执行多个分支中的每一个的情况下获取结果值 每个分支在哪里退出函数?

在以下示例中,跟踪应打印两个输入参数的列表 (或作为文本本身的函数调用)在调用时以及函数在任一分支中退出时的返回值。

myfun <- function(a,b){
  if (a==1) return(b+1)
  if (a==2) return(b*10)
  return(b)
}

【问题讨论】:

    标签: r debugging


    【解决方案1】:

    您正在寻找函数match.call()returnValue()

    myfun <- function(a,b){
        if (a==1) return(b+1)
        if (a==2) return(b*10)
        return(b)
    }
    
    trace("myfun", tracer = substitute(print(as.list(match.call()))),
          exit = substitute(print(returnValue())))
    #> [1] "myfun"
    
    myfun(1, 2)
    #> Tracing myfun(1, 2) on entry 
    #> [[1]]
    #> myfun
    #> 
    #> $a
    #> [1] 1
    #> 
    #> $b
    #> [1] 2
    #> 
    #> Tracing myfun(1, 2) on exit 
    #> [1] 3
    #> [1] 3
    myfun(2, 2)
    #> Tracing myfun(2, 2) on entry 
    #> [[1]]
    #> myfun
    #> 
    #> $a
    #> [1] 2
    #> 
    #> $b
    #> [1] 2
    #> 
    #> Tracing myfun(2, 2) on exit 
    #> [1] 20
    #> [1] 20
    myfun(3, 2)
    #> Tracing myfun(3, 2) on entry 
    #> [[1]]
    #> myfun
    #> 
    #> $a
    #> [1] 3
    #> 
    #> $b
    #> [1] 2
    #> 
    #> Tracing myfun(3, 2) on exit 
    #> [1] 2
    #> [1] 2
    

    reprex package (v0.2.1) 于 2018 年 10 月 7 日创建

    正如Moody_Mudskipper 提到的,在cmets 中,您也可以使用quote() 而不是substitute()

    myfun <- function(a,b){
        if (a==1) return(b+1)
        if (a==2) return(b*10)
        return(b)
    }
    
    trace("myfun", tracer = quote(print(as.list(match.call()))),
          exit = quote(print(returnValue())))
    #> [1] "myfun"
    
    myfun(1, 2)
    #> Tracing myfun(1, 2) on entry 
    #> [[1]]
    #> myfun
    #> 
    #> $a
    #> [1] 1
    #> 
    #> $b
    #> [1] 2
    #> 
    #> Tracing myfun(1, 2) on exit 
    #> [1] 3
    #> [1] 3
    myfun(2, 2)
    #> Tracing myfun(2, 2) on entry 
    #> [[1]]
    #> myfun
    #> 
    #> $a
    #> [1] 2
    #> 
    #> $b
    #> [1] 2
    #> 
    #> Tracing myfun(2, 2) on exit 
    #> [1] 20
    #> [1] 20
    myfun(3, 2)
    #> Tracing myfun(3, 2) on entry 
    #> [[1]]
    #> myfun
    #> 
    #> $a
    #> [1] 3
    #> 
    #> $b
    #> [1] 2
    #> 
    #> Tracing myfun(3, 2) on exit 
    #> [1] 2
    #> [1] 2
    

    reprex package (v0.2.1) 于 2018 年 10 月 7 日创建

    有关两者区别的说明,请参阅this Stack Overflow question

    【讨论】:

    • 赞成,但也许quotesubstitute 更有意义? (相同的输出)
    • @Moody_Mudskipper 在此处添加了一个注释,两者给出相同的输出,以及一个链接,以说明两者之间的差异。
    【解决方案2】:

    只是将其与名称中的 .trace 重叠?

    myfun.trace <- function(a,b){
      if (a==1) return({{"a","b"},{a,b}},{b+1})
      if (a==2) return({{"a","b"},{a,b}},{b*10})
    return({{"a","b"},{a,b}},{b})    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2016-08-30
      相关资源
      最近更新 更多