R代码提供代码执行的进度

时间:2016-03-16 16:40:15

标签: r optimization

所以,我有一个需要在对象列表上执行的任务(总共30个对象)。我以前将这个编码为单独的对象,并且一次运行一个。但在一些StackExchange反馈之后,我已经转到了列表。但是,当我执行代码所以它开始通过列表并完成所需的任务时,我不知道进展是什么。我只看到RStudio GUI中的红色停止符号,所以我不知道计算机是否挂起,或者当前正在处理的列表中的对象是什么。

有没有人试图创建某种反馈代码块,当列出的对象完成后,您会得到某种反馈?

编辑了解更多详情

我有这个清单

sizes <- list(
n1.6<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
n7.8<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1),
n9.10<-c(2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1),

实际上有30个对象,但上面的3个是一个例子

我有这个功能

strata_eq <- function(n_vec){
  sample_means <-matrix(rep(0,80000), nrow=16, ncol=5000)
  for(i in 1:5000){
    sample <- strata(data[,c(1,23)], "stream", n_vec, method="srswor")
    sample <- data[sample$ID_unit,]
    stream_means <- with(sample, tapply(avg.RPD, stream, mean)) 
    sample_means[,i] <- c(unlist(stream_means))
  }
  return(sample_means)
}

然后我想将此函数传递给列表,以便该函数应用于列表中的每个对象。

rates <- lapply(sizes, function(x) strata_eq(x)
) 

然而,这需要很长时间,我希望有某种代码可以帮助提供执行方面的一些进展。也许只是告诉我在列表中完成了什么对象,或者它正在处理哪个对象......?

1 个答案:

答案 0 :(得分:2)

您可以在代码中包含print函数,并且时间已过。如果您的函数在所有对象上都是等效的,那么它应该足以让您估计剩余时间。

代码的开头:

ptm <- proc.time()

在你的功能中:

strata_eq <- function(n_vec){
  sample_means <-matrix(rep(0,80000), nrow=16, ncol=5000)
  for(i in 1:5000){
    sample <- strata(data[,c(1,23)], "stream", n_vec, method="srswor")
    sample <- data[sample$ID_unit,]
    stream_means <- with(sample, tapply(avg.RPD, stream, mean)) 
    sample_means[,i] <- c(unlist(stream_means))
  }
  print(proc.time() - ptm)
  return(sample_means)
}

然后我想将此函数传递给列表,以便该函数应用于列表中的每个对象。

rates <- lapply(sizes, strata_eq)

我可以建议你加强你的功能:

  • 在函数开头之前创建一个等于data [,c(1,23)]的表

  • *ply*函数替换for,稍后将结果转换为矩阵。例如,可以使用rbindlist轻松实现。

  • 导致:使用包data.table