2016-10-06 9 views
1

私は2つのデータセットを持っています:GRACesオブジェクトとして1つはGRangesListで複数のサブセットもう1つ(テスト)。 grlのすべてのサブセットをループし、 "GenomicRanges"ライブラリのfindOverlaps関数を使用して、その重複をTestとし、リスト内のデータ(各反復後に1つの値のみ)を保存したいとします。GRangesオブジェクトをループするときにエラーが発生しました(エラーeval(expr、envir、enclos):非機能を適用しようとしました)

出力は次のようになります。

gr1 2 
gr2 5 
gr3 1 


gr1 <- 
    GRanges(seqnames = "chr2", ranges = IRanges(3, 6), 
      strand = "+", score = 5L, GC = 0.45) 
gr2 <- 
    GRanges(seqnames = c("chr1", "chr1"), 
      ranges = IRanges(c(7,13), width = 3), 
      strand = c("+", "-"), score = 3:4, GC = c(0.3, 0.5)) 
gr3 <- 
    GRanges(seqnames = c("chr1", "chr2"), 
      ranges = IRanges(c(1, 4), c(3, 9)), 
      strand = c("-", "-"), score = c(6L, 2L), GC = c(0.4, 0.1)) 
grl <- GRangesList("gr1" = gr1, "gr2" = gr2, "gr3" = gr3) 
grl 


Test <- 
    GRanges(seqnames = c("chr1", "chr1"), 
      ranges = IRanges(c(1, 5), c(2, 6)), 
      strand = c("-", "-"), score = c(6L, 2L), GC = c(0.5, 0.2)) 


myFunction <- function(input,feature){ 

    tmp = list() 

     for (f in 1:length(objects(feature))){ 

      mtch = findOverlaps(currmySegm, eval(parse(text=paste0("feature$", objects(feature[f]), sep = ""))))) 
      **some calculations** 
      value <- mean(...) 
      } 
     temp[[objects(feature[f])]] <- value 
} 

myFunction(Test,grl) 

Error in eval(expr, envir, enclos) : attempt to apply non-function 

私は機能findOverlapsgrlのサブセットを渡すか、またはリスト

+0

'' GRanges'と 'GRangesList'オブジェの両方で動作しますfindOverlaps' cts( '?GenomicRanges :: findOverlaps'を参照してください)。 'findOverlaps(grl、Test)'または(明示的に) 'lapply(grl、function(x)findOverlaps(x、Test))'を実行することによって、全ての重なりを得ることができます。あなたのサンプルデータによると、 'gr3'だけが' Test'と重なっています。 –

+0

@MauritsEversありがとうございました。それは私が問題を解決するのを助けた。 mtch = lapply(grl、function(x)findOverlaps(x、Test))が機能しました。しかし、もし私がやりたければ:myRanges = ranges(mtch、ranges(Test)、lapply(grl、function(x)ranges(x)))は動作しません。私はlapply(mtch、function(y ranges(y))と置き換えたとき、myRanges = ranges(lapply(mtch、function(y ranges(y))、私があなたに助けてもらえますか? –

+0

'レンジ'で何をしようとしているのか分かりません。 'mtch'はあなたにヒット(すなわちインデックス)を与えるでしょう。重なり合った '' GRanges''エントリー。重複するフィーチャーの数を数えたいのですか、あるいは交差する範囲を抽出しますか? –

答えて

-1
として結果を保存することはできません eval(parse(text=paste0("feature$", objects(feature[f]), sep = ""))))に何か問題のいずれかがあると思います

異なるfindOverlaps例:

# GRangesList object 
gr1 <- 
    GRanges(seqnames = "chr2", ranges = IRanges(3, 6), 
      strand = "+", score = 5L, GC = 0.45) 
gr2 <- 
    GRanges(seqnames = c("chr1", "chr1"), 
      ranges = IRanges(c(7,13), width = 3), 
      strand = c("+", "-"), score = 3:4, GC = c(0.3, 0.5)) 
gr3 <- 
    GRanges(seqnames = c("chr1", "chr2"), 
      ranges = IRanges(c(1, 4), c(3, 9)), 
      strand = c("-", "-"), score = c(6L, 2L), GC = c(0.4, 0.1)) 
grl <- GRangesList("gr1" = gr1, "gr2" = gr2, "gr3" = gr3) 


# GRanges object 
Test <- 
    GRanges(seqnames = c("chr1", "chr1"), 
      ranges = IRanges(c(1, 5), c(2, 6)), 
      strand = c("-", "-"), score = c(6L, 2L), GC = c(0.5, 0.2)) 

# Get overlaps at the GRanges entry level of a GRangesList object 
# This extracts the overlapping GRanges entries from your grl 
# GRangesList object that overlap with a feature from Test. 
hits1 <- lapply(grl, function(x) findOverlaps(x, Test)); 
grl.overlapping <- list(); 
for (i in 1:length(hits1)) { 
    grl.overlapping[[i]] <- grl[[i]][queryHits(hits1[[i]])]; 
} 
names(grl.overlapping) <- names(grl); 
print(grl.overlapping); 

# Count the number of overlapping GRanges objects for every 
# list entry from grl 
counts <- lapply(hits1, length); 
print(counts); 

# Get overlaps at the GRangesList level 
# Note this will only tell you whether *any* GRanges entries from your 
# grl GRangesList object overlap with a feature from Test; it won't 
hits2 <- findOverlaps(grl, Test); 
print(grl[queryHits(hits2)]); 
関連する問題