2009-09-11 60 views
16

假設我剛纔調用了一個函數f,並且函數中某處出現了錯誤。我只想在錯誤發生之前檢查出不同變量的值。獲取R中發生錯誤後的變量狀態

假設我的直覺告訴我這是一個小錯誤,所以我懶得使用debug(f),也懶得插入browser()到我認爲事情出錯的函數部分。而我卻懶得開始投入print()報表。

下面是一個例子:

x <- 1:5 
y <- x + rnorm(length(x),0,1) 
f <- function(x,y) { 
    y <- c(y,1) 
    lm(y~x) 
} 

調用f(x,y)我們得到以下錯誤:

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
    variable lengths differ (found for 'x') 

在這個例子中,我要搶lm()調用前的環境狀況;這樣我可以打電話xy,看看他們的長度是不同的。 (這個例子可能太簡單了,但我希望它能得到這個想法。)

回答

26

正如here指出的那樣,有一個簡單的方法可以做到這一點,我認爲這個技巧有可能改變生活。當我們調用f(x,y)

options(error=recover) 

現在我們將有一個選項來選擇恢復的環境:

首先,調用此。在這裏,我選擇選項1,它打開一個調試器,並讓我在調用lm()之前使用變量。

> f(x,y) 
Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
    variable lengths differ (found for 'x') 

Enter a frame number, or 0 to exit 

1: f(x, y) 
2: lm(y ~ x) 
3: eval(mf, parent.frame()) 
4: eval(expr, envir, enclos) 
5: model.frame(formula = y ~ x, drop.unused.levels = TRUE) 
6: model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) 

Selection: 1 
Called from: eval(expr, envir, enclos) 
Browse[1]> x 
[1] 1 2 3 4 5 
Browse[1]> y 
[1] 1.6591197 0.5939368 4.3371049 4.4754027 5.9862130 1.0000000 
+0

鏈接現已停止。我很想閱讀!嘆 – Ameya 2017-09-13 21:07:35

3

你也可以只使用debug()函數:

> debug(f) 
> f(x,y) 
debugging in: f(x, y) 
debug: { 
    y <- c(y, 1) 
    lm(y ~ x) 
} 
Browse[1]> 
debug: y <- c(y, 1) 
Browse[1]> x 
[1] 1 2 3 4 5 
Browse[1]> y 
[1] 2.146553 2.610003 2.869081 2.758753 4.433881 
3

options(error=recover)

大概回答了這個問題最好的。不過,我想提到另一個方便的調試工具,traceback()。發生錯誤後立即調用它通常足以查明錯誤。