調試時,我常常會想知道在已完成執行的函數使用的變量的值。這怎麼能實現?
例子:
我有功能:
MyFunction <- function() {
x <- rnorm(10) # assign 10 random normal numbers to x
return(mean(x))
}
我想知道存儲在X它不提供給我的值函數執行完畢和功能的環境後,清理乾淨。
調試時,我常常會想知道在已完成執行的函數使用的變量的值。這怎麼能實現?
例子:
我有功能:
MyFunction <- function() {
x <- rnorm(10) # assign 10 random normal numbers to x
return(mean(x))
}
我想知道存儲在X它不提供給我的值函數執行完畢和功能的環境後,清理乾淨。
你提到的調試,所以我認爲不會在腳本以後需要的值,你只是想檢查發生什麼事。在這種情況下,我一直做的是使用browser
:
MyFunction <- function() {
browser()
x <- rnorm(10) # assign 10 random normal numbers to x
return(mean(x))
}
這會把你到函數的範圍,允許你檢查什麼是內部發生內部的交互式控制檯。
有關在R中調試的一般信息,我建議this SO post。
您在這裏有很多選擇。當您分配給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()
。
OP聲明'調試時',所以OP可能有價值來檢查是否事情正常。在這種情況下,我會使用'browser'。 –
MyFunction <- function() {
x <- rnorm(10) # assign 10 random normal numbers to x
return(list(x,mean(x)))
}
這將返回一個列表,其中第一個元素是x,第二個是它的平均
@Dmitrii如果這對你有用,那麼我肯定會採用這種方法,因爲它維護(安全)功能範例。 –
有時x包含數百萬條目,我不想讓它返回。 –
已經有一些很好的解決方案,我想添加一種可能性。我強調了一個事實,即您要知道變量的值在已完成執行的函數中使用。因此可能不需要分配這些值,並且您不希望(先驗)停止執行。解決方案是簡單地使用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)
。
我經常使用它,但是有時候我的媒介有百萬條目...... –
你不必打印整個對象,你可以打印它的'str','head','summary','length',''意思「等。 – flodel
爲了避免修改代碼,你也可以使用'debug(MyFunction)'或'debugonce(MyFunction)'。但是這些都會在函數被調用時中斷執行。 – flodel