我正在使用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)。
在检查我重新启动它的逻辑是否稳定之前,我不想停止我的脚本。
感谢您的期待
答案 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是替换信息的向量。