当我在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”这样的东西。
你能帮帮我吗?谢谢!答案 0 :(得分:4)
1)cat 您可以向该函数添加cat
,message
或print
语句。
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)以及其他可用进度条的进度包。