2017-04-06 75 views
1

當我在R中運行一個長程序時,是否可以顯示中間步驟?如何在R中顯示長程序的中間步驟?

舉例來說,我有一個日常工作建立一個原始矩陣的隨機版本,根據空模型(包雙邊):

#Build N randomized version of the matrix contained in data  
nulls <- nullmodel(data, N=1000, method=3) 

#Calculate the same network metric for all N randomized matrices 
modules.nulls <- sapply(nulls, computeModules, method = "Beckett") 

根據計算機的處理能力和N的大小,完成例程需要很長的時間。我想包括一個代碼在控制檯上顯示程序的第一部分和第二部分的所有中間步驟。像「矩陣1,矩陣2 ...矩陣N」。

你能幫我嗎?謝謝!

回答

4

1)貓您可以添加catmessageprint報表功能。

2)跟蹤,或者如果你不想修改函數本身則trace這樣說:

# test function 
fun <- function(x) length(x) 

trace(fun, quote(print(i <<- i + 1))) 

i <- 0 
out <- sapply(iris, fun) 

,並提供:

Tracing FUN(X[[i]], ...) on entry 
[1] 1 
Tracing FUN(X[[i]], ...) on entry 
[1] 2 
Tracing FUN(X[[i]], ...) on entry 
[1] 3 
Tracing FUN(X[[i]], ...) on entry 
[1] 4 
Tracing FUN(X[[i]], ...) on entry 
[1] 5 

爲了扭轉這一使用untrace(fun)

3)包裝另一種可能性是創建一個包裝。 flush.console是可選的,並且具有避免控制檯緩衝的效果,因此您可以立即看到輸出。

wrap_fun <- function(x) { print(i <<- i + 1); flush.console(); fun(x) } 

i <- 0 
out <- sapply(iris, wrap_fun) 

4)tkProgressBar一種有些發燒友的方法是使用一個進度條。此示例代碼使用tcltk軟件包,它是所有標準R發行版中的開箱即用軟件包(因此您無需下載並安裝它 - 它已經存在,並且library語句足以加載它)。

library(tcltk) 

fun2 <- function(x) Sys.sleep(2) # test function 
wrap_fun2 <- function(x) { 
    i <<- i + 1 
    setTkProgressBar(bar, i, label=i) 
    fun2(x) 
} 

bar <- tkProgressBar("Progress", max = 5) 
i <- 0 
out <- sapply(iris, wrap_fun2) 
close(bar) 

另見?txtProgressBar?winProgressBar(僅Windows)以及進度包可用其它進度條。

+0

親愛的格洛騰迪克,非常感謝你的回覆。但是,我嘗試使用您建議的代碼,但它不起作用。我使用兩個函數(nullmodel和computeModules),它們構建在R包(二部分)中,所以我不能修改它。如果我使用建議的第一個解決方案(跟蹤),我如何使用我的腳本?謝謝。 – Marco

+0

你可以跟蹤包中的函數。 「trace」幫助文件中甚至有一個例子。 –

+0

謝謝。我已閱讀此幫助,但未找到解決方案。我會再看看。 – Marco

相關問題