Atte Tenkanen
2006-Mar-24 22:22 UTC
[R] How to replace some output candidates in a function?
Hello, I have a function called "prime form" (here below). It works mostly ok, but some of the output vectors it gives are not those I want. For example, if the result (Pf) in the end is c(0,2,3,7,8) I'd like to replace it with the vector c(0,1,5,7,8) and there are appr. 20 other cases. How to make those corrections in the end of the algorithm before "return(Pf)"? I know this works... if (identical(Pf,c(0,2,3,7,8))){Pf=c(0,1,5,7,8)} if (identical(Pf,c(0,2,5,6,9))){Pf=c(0,1,4,7,9)} . . . ... but is there some more elegant way? ##*****************************## ## Function primeform (pform) ## ##*****************************## # INPUT:string of pitch class numbers. # USAGE: pform(c(1,4,8,9,0,4)). pform=function(spcn) { if(length(spcn)==1) # if the length of the pcs is 1, # then the prime form is c(0) { Pf=c(0) } else { spcno=sort(unique(spcn));# sort & lop duplicates succ_i_arr=c() # create successive interval array succ_i_arr[length(spcno)]=(spcno[1]+12)-spcno[length(spcno)] for(i in 2:length(spcno)) { succ_i_arr[i-1]=spcno[i]-spcno[i-1] } m=matrix(nrow=length(succ_i_arr),ncol=length(succ_i_arr)) for(i in 1:length(succ_i_arr)) # matrix of possible alternatives { m[,i]=succ_i_arr succ_i_arr=c(succ_i_arr[length(succ_i_arr)],succ_i_arr[2:length(succ_i_arr)-1]) } b=0 for(i in 1:length(m[1,])) { b[i]=sum(m[,i]^c(1:length(m[1,]))) } m=as.vector(m[,rev(order(b))[1]]) Pf=c() # the winner set is transposed to prime form Pf[1]=0 for(i in 1:(length(succ_i_arr)-1)) { Pf[1+i]=Pf[i]+m[i] } } return(Pf) } #******************# Atte Tenkanen University of Turku, Finland