在R 2.14.1中,'by'参数的错误签名是什么意思?

时间:2012-02-21 18:43:52

标签: r

这是我的代码

slidingwindowplotATGC = function(windowsize, inputseq) 
{

starts = seq(1, length(inputseq)-windowsize, by = windowsize)
n = length(starts)
chunkGs = numeric(n)
chunkAs = numeric(n)
chunkTs = numeric(n)
chunkCs = numeric(n)
for (i in 1:n) { 
    chunk = windowsize[starts[i]:(starts[i]+9999)]
    chunkG = sum("g" == chunk)/length(chunk)
    chunkA = sum("a" == chunk)/length(chunk)
    chunkT = sum("t" == chunk)/length(chunk)
    chunkC = sum("c" == chunk)/length(chunk)
  chunkGs[i] = chunkG
    chunkAs[i] = chunkA
  chunkTs[i] = chunkT
  chunkCs[i] = chunkC
}   
plot(starts,chunkGs,type="b",ylim=c(min(min(chunkAs),min(chunkTs),min(chunkCs),min(chunkGs)),max(max(chunkAs),max(chunkTs),max(chunkCs),max(chunkGs))),col = "red")
points(starts,chunkTs,col = "blue")
points(starts,chunkAs,col = "green")
points(starts,chunkCs)

}

我收到以下错误消息,

Error in seq.default(1, length(inputseq) - windowsize, by = windowsize) : 
  wrong sign in 'by' argument

这是我在运行此类代码之前从未得过的,事实上我重新运行以前运行良好的旧代码,除了这次我得到的这个错误消息似乎没有任何意义!在我完全疯了之前我需要帮助...也许我只是在这个程序上很糟糕,但在我看来它有自己的想法...我在关于ylim函数之前也收到了一条错误信息,声明它需要是一个有限的值,这就是我给它的东西? HELP !!!

2 个答案:

答案 0 :(得分:3)

更改

starts = seq(1, length(inputseq)-windowsize, by = windowsize)

starts = seq(1, nchar(inputseq)-windowsize, by = windowsize)

假设您使用字符向量作为inputseq,例如

slidingwindowplotATGC(3, "ATAGACGATACGATACCCCGAGGGTAGGTA")

ETA:除了这种差异之外,你如何使用角色向量还有一些非常严重的问题。例如:

 windowsize[starts[i]:(starts[i]+9999)]
  1. 为什么看起来你正在从windowsize中选择,这只是你窗口大小的整数?您是否尝试从inputseq中进行选择?

  2. 即使您从inputseq中选择,这样做的方法是substr(inputseq, start, stop)

  3. starts[i]+9999来自哪里?你的意思是starts[i]+windowsize

  4. 您应该重新开始并仔细考虑您要做的事情,并在R中学习正确的工具。

    ETA:这是对你要做的事情的拟议改写(你需要先安装动物园包):

    library(zoo)
    
    slidingwindowplotATGC = function(windowsize, inputseq) 
    {
        print(nchar(inputseq)-windowsize)
        s = strsplit(inputseq, "")[[1]]
        starts = seq(1, nchar(inputseq)-windowsize, by = windowsize)
        n = length(starts)
        letters = c("a", "c", "g", "t")
        colors = c("green", "black", "red", "blue")
        counts = t(sapply(letters, function(l) rollapply(s, windowsize, function(x) mean(x == l))))
        plot(counts[1, ], type="l", col=colors[1])
        for (i in 2:4) {
            points(counts[i, ], type="l", col=colors[i])
        }
        print(counts)
    }
    
    slidingwindowplotATGC(10, "aagaaaagatcaaagaccagccgccccaccccccagagccccccc")
    

    这应该可以帮助你完成大部分工作。在那之后,你自己; - )

答案 1 :(得分:3)

进一步凝结。您需要分别指定windowsize(窗口宽度)和by(采样周期),尽管我认为您希望它们相同(即将序列切换为独占)块) - 如果你想要一个滑动窗口,你可以使用by=1

您上面看到的错误最有可能发生,因为某些原因windowsize大于nchar(inputseq)

slidingwindowplotATGC = function(windowsize, by, inputseq) {
  s = strsplit(inputseq, "")[[1]]
  colors = c("green", "black", "red", "blue")
  counts =  rollapply(factor(s), width=windowsize, by=by,table)
  matplot(counts,type="l", lty=1,col=colors)
  counts
}

itest <- "aagaaaagatcaaagaccagccgccccaccccccagagccccccc"
slidingwindowplotATGC(10, itest)

您还应该检查Bioconductor - 在某处可以使用有效的代码进行此类摘要。