首页 > 解决方案 > 为什么我的 while 循环卡住了?- 在 R 中编程

问题描述

我正在尝试制作一个函数来计算“a”“t”“g”和“t”“a”“g”或“t”“g”“a”或“t”“a”“a " 向量内。但是我的代码卡在了 while 循环中。一个例子就像 x = “a” “a” “a” “t” “a” “t” “g” “t” “c” “g” “t” “t” “t” “t” “一个”“克”。在此示例中,代码应计算“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)
}

标签: r

解决方案


这是一种非常低效且不像 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. 我强烈建议不要在这里重新发明轮子,而是建议使用一些为这类任务而开发的标准 Bioconductor 包。


推荐阅读