R:带有()函数的调试模式

时间:2014-02-20 23:07:50

标签: r debugging with-statement

由于某种原因,当我的函数体在with()表达式中时,调试模式似乎不允许我进入with()部分。为什么会这样,有没有解决这个问题的方法?下面是一个愚蠢的(但希望可重复的)演示。

    ff=function(x){
      print("Hello")
      with(iris,{
        y=x;
        z=y+mean(Sepal.Width);
        return(z);})
    }

现在进入调试模式并试用该功能......

    debugonce(ff);debugonce(with);
    ff(10)

调试模式只是跳过with()子句,并返回答案(13.05733)。我如何介入这些内部条款?

1 个答案:

答案 0 :(得分:4)

这是有效的,只是你期望它做的不是它的作用。 debug将查看with代码,而不是您作为参数传递的代码内部。仔细看看:

> ff(10)
debugging in: ff(10)
debug at #1: {
print("Hello")
with(iris, {
  y = x
  z = y + mean(Sepal.Width)
  return(z)
})
}
Browse[2]> n
debug at #2: print("Hello")
Browse[2]> n
[1] "Hello"
debug at #3: with(iris, {
y = x
z = y + mean(Sepal.Width)
return(z)
})
Browse[2]> n

现在看看这里发生了什么,我们正在调整with

debugging in: with(iris, {
  y = x
  z = y + mean(Sepal.Width)
  return(z)
})

这是关键:

debug: UseMethod("with")
Browse[3]> n
[1] 13.05733

发生什么事了?查看with代码:

> with
function (data, expr, ...) 
  UseMethod("with")
<bytecode: 0x00000000092f0e50>
<environment: namespace:base>

正如您所看到的,我们在with中调试了单行。如果你想更详细地了解with.default中发生的事情,你也可以调试with,但我怀疑它会做你想要的。我不知道如何间接地做到这一点(即使你可以调试{,我认为你无法做到这一点,因为你会看到{的代码。 ,而不是{的参数,与with相同),但作为黑客,您可以使用browse()

ff=function(x){
  print("Hello")
  with(iris,{
    browser()    # <<<--- this will allow you to browse inside the expression
    y=x;
    z=y+mean(Sepal.Width);
    return(z);})
}