Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R表示从中心值向外迭代到极值的循环_R_Performance_For Loop - Fatal编程技术网

R表示从中心值向外迭代到极值的循环

R表示从中心值向外迭代到极值的循环,r,performance,for-loop,R,Performance,For Loop,我试图提高我的代码的速度,它试图使用3个具有大范围的变量来优化一个值。最有可能的输出使用范围中的值,因此从每个变量的最低可能值开始浪费时间。我想从中间值开始迭代!实际问题有数千行,数字在150-650之间。C、 H和O限值将在一定程度上根据起始值进行定义,但通常更可能位于定义范围内的中心值。有没有一种方法可以定义for循环,使其像我希望的那样向外工作?我能想到的唯一一种非常简陋的方法是从向量(例如1=20、2=21、3=19等)简单地重新定义循环中的值。请参见下面的当前代码: set_error

我试图提高我的代码的速度,它试图使用3个具有大范围的变量来优化一个值。最有可能的输出使用范围中的值,因此从每个变量的最低可能值开始浪费时间。我想从中间值开始迭代!实际问题有数千行,数字在150-650之间。C、 H和O限值将在一定程度上根据起始值进行定义,但通常更可能位于定义范围内的中心值。有没有一种方法可以定义for循环,使其像我希望的那样向外工作?我能想到的唯一一种非常简陋的方法是从向量(例如1=20、2=21、3=19等)简单地重新定义循环中的值。请参见下面的当前代码:

set_error<-2.5
ct<-c(325.00214,325.00952,325.02004,325.02762,325.03535,325.03831,325.04588, 325.05641,325.06402,325.06766,325.07167,325.07454,325.10396)


FormFun<-function(x){
    for(C in 1:40){
      for(H in 1:80){
        for(O in 1:40){
        test_mass=C*12+H*1.007825+O*15.9949146-1.0072765

        error<-1000000*abs(test_mass-x)/x

        if(error<set_error){
          result<-paste("C",C,"H",H,"O",O,sep ="")
          return(result)
          break;break;break;break
        }
        }
        }
        }
}

old_t <- Sys.time()
ct2<-lapply(ct,FormFun)
new_t <- Sys.time() - old_t # calculate difference
print(new_t)

set_error使用矢量化并创建:


FormFun1\u fac Roland,我遇到过gr网格中多行错误更改为
ind的情况
FormFun1_fac <- function(gr) {
  gr <<- gr
  function(x, set_error){
  test_mass <- with(gr, C*12+H*1.007825+O*15.9949146-1.0072765)
  error <- 1000000 * abs(test_mass - x) / x
  ind <- which(error < set_error)[1]
  if (is.na(ind))  return(NULL)
  paste0("C", gr[ind, "C"],"H", gr[ind, "H"],"O", gr[ind, "O"])
  }
}
FormFun1 <- FormFun1_fac(expand.grid(C = 1:40, H = 1:80, O = 1:40))

ct21 <- lapply(ct, FormFun1, set_error = set_error)
all.equal(ct2, ct21)
#[1] TRUE