r - 为什么我的 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 的方法来计算两个模式之间的字符数。
这是一种替代方法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 包。
推荐阅读
- c - 使用 malloc 更改结构内存大小时
- apache - 获取 url (.htaccess) 的最后一部分
- python - 第一次使用 Django,无法访问 DJango 管理错误 500
- vb.net - 从 CSV 读取数据的问题 - 排序和格式化问题
- c# - 如何将信息绑定到具有多个窗口的 WPF 应用程序中的 DataGrid?
- javascript - 计数函数的时间复杂度
- python - IF ... THEN 结构以及如何跨多行应用
- python - 为什么我不能通过使用使语句为假的参数调用它所在的函数来停止while循环?
- python - 在 Python 中将 HJD 转换为 JD
- java - JavaFX TextArea 字符串读取问题