Buongiorno ragazzi domani dovrò sostenere l' esame orale di informatica....Spero che qualcuno possa correggermi questo esercizio di programmazione in R:
Scrivere una funzione contaMotif(dna) che prende in input una sequenza di dna rappresentata come un vettore di caratteri: "A","T","C","G" e restituisce il numero di occorrenze del motif: GC[T]T(1,2)A all' interno della sequenza. Si ricorda che: -Le parentesi quadre racchiudono le basi che possono comparire in quella posizione -Le parentesi graffe racchiudono le basi che non possono comparire in quelle posizioni -Il punto . equivale a [ATGC], cioè che in tale posizione può comparire qualsiasi base -Le parentesi tonde indicano l' intervallo di basi qualsiasi che possono comparire in tali posizioni
Io l' ho risolto in questo modo:
contaMotif <- function ( dna ) { contatore <- 0 indiceMax1<- length ( dna ) - 6 indiceMax2<- length(dna)-5 for ( i in c ( 1 : indiceMax1 ) ) { if (dna [ i ] == "G" & dna[i+1]=="C" & dna[i+2]=="T" & dna[i+3]=="T" & dna[i+6]=="A"){ contatore<-contatore+1 } } for(i in c(1:indiceMax2)){ if(dna [ i ]== "G" & dna[i+1]=="C" & dna[i+2]=="T" & dna[i+3]=="T" & dna[i+5]=="A"){ contatore <- contatore + 1 } } return ( contatore ) }
Il problema è che quando considero che il motif è lungo 7,mi conta correttamente....quando considero che è lungo 6, mi dice che c' è qualche errore. Il motif può essere lungo o 6 o 7 proprio perchè in posizione 5 possono esserci o 1 o 2 basi!! Spero che qualcuno riesca a capire dov' è l' errore visto che domani il prof. me lo farà sicuramente eseguire all' esame! Grazie mille anticipatamente a tutti!!
va a leggere dna[7] quando i=1. Se la sequenza è di 6bp, dna[7] non esiste.
Dovresti quindi avere un controllo sulla lunghezza della stringa.
PS: come ho già detto in passato questa è una delle soluzioni più inefficienti di risolvere questo tipo di problemi e -semmai ti ritrovassi a dover risolvere un problema del genere in una situazione reale- dovresti evitare assolutamente questo tipo di approccio, molto prono ad errori.