我可以在R中停止并启动脚本

时间:2015-05-19 00:59:53

标签: r

我正在使用R,我的脚本需要很长时间。我想我可以阻止它,然后通过改变我的计数器再次启动它。

我的代码就是这个

  NC <- MLOA
  for (i in 1:313578){
   len_mods <- length(MLOA[[i]])
   for (j in 1:2090){
      for(k in 1:len_mods){
          temp_match <- matchv[j]
          temp_rep <- replacev[j]
          temp_mod <- MLOA[[i]][k]
          is_found <- match(temp_mod,temp_match, nomatch = 0, incomparables = 0)
             if(is_found[1] == 1) NC[[i]][k] <- temp_rep
             rm(temp_match,temp_rep,temp_mod)
         }
     }
 }

我在想我可以停止我的脚本,然后通过检查i,j和k的值来重新启动它,并将计数更改为以其当前值开始。因此,而不是计算&#34;因为(i in 1:313578)&#34;如果我达到100,000,我可以做(我在100000:313578)。

在检查我重新启动它的逻辑是否稳定之前,我不想停止我的脚本。

感谢您的期待

3 个答案:

答案 0 :(得分:1)

我有点困惑你在做什么。通常在这个论坛上,大大简化代码是一个好主意,并且只是在一个非常简单的例子中展示问题的核心。这可能会有所帮助。将for循环放在一个函数中,该函数的参数是循环的数字序列的第一个元素。例如:

myloop <- function(x,...){
 for (i in seq(x,313578,1)){
...

通过这种方式,您可以在循环开始时轻松操作。

然而,更重要的问题是,为什么你首先使用for循环?在R中,应该不惜一切代价避免for循环。通过矢量化代码,您可以大大提高其速度。我已经意识到速度提高了500倍!

通常,在R中使用for循环的唯一原因是for循环的当前迭代依赖于先前的迭代。如果是这种情况,那么你可能会遇到缓慢的for循环。

然而,根据您的计算机技能,即使循环也可以在R中更快。如果您知道C,或者愿意学习一点,与C接口可以大大提高代码的速度。

提高代码速度的一种简单方法是使用R&#39的字节编译器,但不幸的是,这种方法不会产生与C接口相同的速度。查看cmpfun函数。

关于加速代码的最后一件事:以下代码行temp_match <- matchv[j]看起来非常无害,但是,这确实会减慢速度。这是因为每次您将matchv[j]分配给temp_match时,您都会复制temp_match。这意味着您的计算机需要找到一些将此副本存储在RAM中。 R是聪明的,当你制作越来越多的副本时,它会在你之后清理并丢弃那些你不再使用垃圾收集功能的副本。但是,查找存储副本的位置以及调用垃圾收集功能需要花费时间。如果您想了解更多信息,请阅读此内容:http://adv-r.had.co.nz/memory.html

答案 1 :(得分:0)

您还可以使用while循环来保存计数器。在下文中,您可以随时停止脚本(并查看中间结果)并通过更改continue=TRUE或仅运行脚本的循环部分来重新启动:

n <- 6
res <- array(NaN, dim=rep(n,3))

continue = FALSE
if(!continue){
  i <- 1
  j <- 1
  k <- 1
}


while(k <= n){
  while(j <= n){
    while(i <= n){
      res[i,j,k] <- as.numeric(paste0(i,j,k))
      Sys.sleep(0.1)
      i <- i+1
    }
    j <- j+1
    i <- 1
  }
  k <- k+1
  j <- 1
}  

i;j;k
res

答案 2 :(得分:0)

这就是我要做的......

 for(i in 1:313578)
    {
     mp<-match(MLOA[[i]],matchv,nomatch = 0, incomparables=0)
     lgic<- which(as.logical(mp),arr.ind = FALSE, useNames = TRUE)
     NC[[i]][lgic]<-replacev[mp]}

感谢那些做出回应的人,Jacob H,你是对的,我绝对是R的新手,你的回答很有用。弗兰克 - 你的指针有所帮助。

我的解决方案可能仍然不是最佳解决方案。我想做的就是寻找和替换。 Matchv是我在每个MLOA [i]中搜索匹配的向量,其中replacev是替换信息的向量。