R

时间:2018-10-07 13:35:10

标签: r debugging

我想跟踪一个函数,以便在调用时打印所有参数 返回结果时,将打印返回值和参数。 功能跟踪允许定义在进入和退出函数调用时要执行的动作。 是否有一个函数返回该函数中的参数列表,并且有一种无需执行多个分支中的每个分支就可以获取结果值的方法 每个分支在哪里退出该功能?

在以下示例中,

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

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

2 个答案:

答案 0 :(得分:3)

您正在寻找功能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-07创建

正如Moody_Mudskipper所述,在注释中,您也可以使用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-07创建

有关两者之间差异的说明,请参见this Stack Overflow question

答案 1 :(得分:0)

名称是否只与.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})    }