2017-10-12 7 views
1

J'ai regardé la question précédemment posée au sujet de garder la sortie «pour la boucle» dans une liste mais je ne peux pas sembler l'appliquer à ma fonction.Ajouter la sortie de pour la boucle à la liste

Peut-être que quelqu'un peut me donner une idée de ce que je fais mal.

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 
    } 
    } 
} 

Cette fonction n'ajoute aucun élément à la liste, qui est toujours vide?

+0

Vous ne devriez pas utiliser un objet statique de l'environnement global au sein d'une fonction personnalisée. Au lieu de cela, utilisez une variable et renvoyez-la dans l'appel de la fonction: 'count_gc <- function (x) ...'. Remplacez la 'gc_list [[i]]' par 'mylist [[i]]' dans la fonction, placez un 'mylist <- list()' au début et un 'return (mylist)' à la fin, puis appelez avec 'gc_list <- count_gc (x)'. – LAP

Répondre

5

Utilisez lapply() et vous épargner le souci

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 
    } 
}) 

Mais mieux, utiliser une structure de données 'bien rangé'

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

et plus simple (pas if() condition) et vectorisé (x peut être toute longueur) fonction

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

muter les données bien rangé

df$gc = gc_content(df$seq) 
1

S'il vous plaît utiliser ci-dessous le code

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 
    } 
}