2014-02-20 40 views
2

出于某种原因,当我的函数的主体位于with()表达式中时,调试模式似乎不让我步入with()部分。为什么会这样,并且是否有解决此问题的方法?下面是一个愚蠢的(但希望可重现)演示。R:带有()函数的调试模式

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

现在进入调试模式和试模功能...

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

调试模式简单地跳过了与()子句,然后返回答案(13.05733)。我如何进入这些内部子句?

+0

据调试'with',它只是你唯一指定的调试,做的方法分派的部分。尝试调试'with.default'。 – joran

回答

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中正在发生的事情,也可以调试with.default,但我怀疑它会做你想做的事情。我不知道如何间接地做到这一点(即使你可以调试{,我认为你不能这样做,这样做无济于事,因为你会看到{的代码,而不是{的参数,与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);}) 
}