2012-10-06 31 views

回答

3

你提到的調試,所以我認爲不會在腳本以後需要的值,你只是想檢查發生什麼事。在這種情況下,我一直做的是使用browser

MyFunction <- function() { 
    browser() 
    x <- rnorm(10) # assign 10 random normal numbers to x 
    return(mean(x)) 
} 

這會把你到函數的範圍,允許你檢查什麼是內部發生內部的交互式控制檯。

有關在R中調試的一般信息,我建議this SO post

+0

爲了避免修改代碼,你也可以使用'debug(MyFunction)'或'debugonce(MyFunction)'。但是這些都會在函數被調用時中斷執行。 – flodel

1

您在這裏有很多選擇。當您分配給x時,最簡單的方法是使用<<-運算符。這也是最有可能的get you into trouble

> test <- function() x <- runif(1) 
> x <- NA 
> test() 
> x 
[1] NA 
> test <- function() x <<- runif(1) 
> test() 
> x 
[1] 0.7753325 

編輯

@PaulHeimstra指出,你想這個進行調試。這裏有一個指針,一些通用的技巧:

General suggestions for debugging in R

我建議要麼設置options(error=recover)或結合使用trace()browser()

+1

OP聲明'調試時',所以OP可能有價值來檢查是否事情正常。在這種情況下,我會使用'browser'。 –

2
MyFunction <- function() { 
    x <- rnorm(10) # assign 10 random normal numbers to x 
    return(list(x,mean(x))) 
} 

這將返回一個列表,其中第一個元素是x,第二個是它的平均

+0

@Dmitrii如果這對你有用,那麼我肯定會採用這種方法,因爲它維護(安全)功能範例。 –

+0

有時x包含數百萬條目,我不想讓它返回。 –

1

已經有一些很好的解決方案,我想添加一種可能性。我強調了一個事實,即您要知道變量的值在已完成執行的函數中使用。因此可能不需要分配這些值,並且您不希望(先驗)停止執行。解決方案是簡單地使用print。因此,它不使用默認值,但只有當你要調試,選擇打印或不能夠作爲函數參數傳遞:

MyFunction <- function(x, y, verbose = FALSE) { 
    a <- x * y 
    if (verbose) print(a) 
    b <- x - y 
    if (verbose) print(b) 
    return(a * b) 
} 

在一般情況下,你可以運行你的函數是這樣的:MyFunction(10, 4)但是當你想看到那些中間結果,做MyFunction(10, 4, verbose = TRUE)

+0

我經常使用它,但是有時候我的媒介有百萬條目...... –

+0

你不必打印整個對象,你可以打印它的'str','head','summary','length',''意思「等。 – flodel

相關問題