2017-04-06 31 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

相关问题