为什么我的while循环卡住了? -使用R

时间:2018-10-28 11:18:38

标签: r

我正在尝试创建一个函数来计算“ a”,“ t”,“ g”和“ t”,“ a”,“ g”或“ t”,“ g”,“ a”或“ t”,“ a”之间的字符数向量中的“”。但是我的代码陷入了while循环中。例如x =“ a”“ a”“ a”“ t”“ a”“ t”“ g”“ t”“ c”“ g”“ t”“ t”“ t”“ t”“ a“” g。在此示例中,代码应在“ a”,“ t”,“ g”和“ t”,“ a”,“ g”之间计数6个字符。任何帮助将不胜感激:)。

orfs<-function(x,p){
count<-0
cntorfs<-0
n<-length(x)
v<-n-2
for (i in 1:v){
if(x[i]=="a"&& x[i+1]=="t"&& x[i+2]=="g"){
  k<-i+3;
  w<-x[k]
  y<-x[k+1]
  z<-x[k+2]
  while (((w!="t")&&(y!="a")&& (z!="g"))||((w!="t")&&(y!="a")&&(z!="a"))||((w!="t")&&(y!="g")&& (z!="a"))||(i+2>v)){
    count<-count+1
    k<-k+1
    w<-x[k]
    y<-x[k+1] 
    z<-x[k+2]
  }
  }
if(count>p){
  cntorfs<-cntorfs+1 
} 
if (count!=0){
  count<-0
}
}
cat("orf:",cntorfs)
}

1 个答案:

答案 0 :(得分:1)

这是一种非常效率低下且不像R的方式来计算两个模式之间的字符数。

这里是使用gsub的替代方法,它可以帮助您入门,并且可以扩展为解决其他终止密码子的问题:

x <- c("a", "a", "a", "t", "a", "t", "g", "t", "c", "g", "t", "t", "t", "t", "a", "g")

nchar(gsub("[actg]*atg([actg]*)tag[actg]*", "\\1", paste0(x, collapse = "")))
#[1] 6

可以使用Biostrings::matchPattern here找到更健壮和通用的方法。我强烈建议不要在这里重新发明轮子,而是建议使用为这些任务而开发的一些标准Bioconductor软件包。