2017-10-12 123 views
1

我已經看過以前提過的關於在列表中保留'for循環'輸出的問題,但我似乎無法將其應用於我的函數。將for循環的輸出添加到列表中

也許有人可以給我一個關於我做錯了什麼的線索。

dna_seqs <- list('id1', 'ATGGCAATAACCCCCCGTTTCTACTTCTAGAGGAGAAAAGT', 'id2', 'TCCGTTAAGATATTCTTACGTGTGACGTAGCTATGTATTTTGCAGAGCTGGCGAACGCGTTGAACACTTCACAGATGGT', 'id3', 'AGCTGGTTCCTGCGTGAGCTCGAGACTCGGGATGACAGCTCTTTAAACATAGAGCGGGGGCGTCGAACGGTCGA', 'id4', 'CATCACCGCGATAGGCTGACAAAGGTTTAACATTGAATAGCAAGGCACTTCCGGTCTCAATGAACGGCCGGGAA') 

gc_list <- list() 
count_gc <- function(x) { 
    for (i in x) { 
    if (startsWith(i, 'id')) { 
     gc_list[[i]] <- i 

    } 
    else { 
     seq <- str_to_upper(i) 
     seq <- gsub('N', '', seq) 
     gc <- str_count(seq, 'G') + str_count(seq, 'C') 
     gc_content <- gc/nchar(seq) * 100 
     gc_list[[i]] <- gc_content 
    } 
    } 
} 

這個函數沒有在列表中追加任何元素,它仍然是空的?

+0

一個自定義函數中你不應該從全局環境中使用靜態對象。相反,使用一個變量並在函數調用中返回它:'count_gc < - function(x)...'。在函數中用'mylist [[i]]'替換'gc_list [[i]]',在開始處放置一個mylist < - list(),在末尾放置一個'mylist'它用'gc_list < - count_gc(x)'。 – LAP

回答

5

使用lapply()並保存自己的擔心

gc_list <- lapply(dna_seqs, function(seq) { 
    if (startsWith(seq, "id")) { 
     seq 
    } else { 
     seq <- str_to_upper(seq) 
     seq <- gsub('N', '', seq) 
     gc <- str_count(seq, 'G') + str_count(seq, 'C') 
     gc/nchar(seq) * 100 
    } 
}) 

不過還好,使用一個 '整潔' 的數據結構

df = data.frame(
    id = unlist(dna_seqs[c(TRUE, FALSE)]), 
    seq = unlist(dna_seqs[c(FALSE, TRUE)]), 
    stringsAsFactors = FALSE 
) 

和簡單(沒有if()條件)和矢量化(x可以任何長度)功能

gc_content = function(x) { 
    x = gsub("N", "", str_to_upper(x)) 
    str_count(x, "[GC]")/nchar(x) * 100 
} 

變異整潔數據

df$gc = gc_content(df$seq) 
1

請使用下面的代碼

for(i in 1:length(dna_seqs)){ 

    if (startsWith(dna_seqs[[i]], 'id')) { 
    gc_list[[i]] <- dna_seqs[[i]] 

    } 
    else { 
    seq <- str_to_upper(dna_seqs[[i]]) 
    seq <- gsub('N', '', seq) 
    gc <- str_count(seq, 'G') + str_count(seq, 'C') 
    gc_content <- gc/nchar(seq) * 100 
    gc_list[[i]] <- gc_content 
    } 
}