Почему мой цикл while застревает?-Программирование на R - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь создать функцию, которая рассчитывает де-каратеры между "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" ""г".В этом примере код должен считать 6 символов между «a», «t», «g» и «t», «a», «g».Любая помощь будет оценена :).

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 голосов
/ 28 октября 2018

Это очень неэффективный и не-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, которые были разработаны именно для таких задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...