【发布时间】:2015-02-08 21:44:00
【问题描述】:
我编写了一个函数,可以找到长 DNA 序列中子序列的索引。当我的较长 DNA 序列小于 4000 个字符时,它可以工作。但是,当我尝试将相同的函数应用于更长的序列时,控制台给了我一个 + 而不是 >... 这让我相信问题出在字符串的长度上。
例如:当较长的序列是:“GATATATGCATATACTT”,而子序列是:“ATAT”时,我得到索引“1、3、9”(从0开始)
dnaMatch <- function(dna, sequence) {
ret <- list()
k <- str_length(sequence)
c <- str_length(dna) - k
for(i in 1:(c+1)) {
ret[i] = str_sub(dna, i, i+k-1)
}
ret <- unlist(ret)
TFret <- lapply (ret, identical, sequence)
TFret <- which(unlist(TFret), arr.ind = TRUE) -1
print(TFret)
}
基本上,我的问题是……有什么办法可以绕过字符串类中的字符限制?
【问题讨论】:
-
"控制台给我一个 + 而不是 >" - 这通常是由于缺少
)、"、'或}。你有没有仔细检查你的代码是否有错别字? -
抱歉,澄清一下:当我尝试将任意变量设置为非常长的 DNA 序列时,控制台会提示我。即:dna
-
我明白了,我能够通过运行
cat(paste0(rep("abcdef",1000),collapse=""))、复制输出并尝试将其分配给对象x <- "[paste copied text]"来复制此问题。可能存在某种缓冲限制。 -
我可以复制您的示例 nrussell,但这会正确分配
x<-paste0(rep("abcdef",1000),collapse="") -
在 100k 长度的字符串上使用
dnaMatch(x, 'ATATAT')和gregexpr('ATATAT', x)分别是 49 秒和 0.003 秒。抱歉,没有耐心再运行你的循环了