如何在R中显示长例程的中间步骤?

时间:2017-04-06 11:32:42

标签: r loops social-networking bipartite sna

当我在R中运行一个长例程时,是否可以显示中间步骤?

例如,我正在使用一个例程来构建原始矩阵的随机版本,基于null模型(包 bipartite ):

#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”这样的东西。

你能帮帮我吗?谢谢!

1 个答案:

答案 0 :(得分:4)

1)cat 您可以向该函数添加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)以及其他可用进度条的进度包。