2014-02-20 65 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);}) 
}