Skip to content
Back to formatted view

Raw Message

Message-ID: <1350850755.5182.YahooMailNeo@web142605.mail.bf1.yahoo.com>
Date: 2012-10-21T20:19:15Z
From: arun
Subject: Changing a for loop to a function using sapply
In-Reply-To: <50845207.30605@sapo.pt>

Hi,

With sapply():
fun3<-function(n){
?paste(t(sapply(random.string(n),randomizeString)),collapse="")
?}
?DNA3<-replicate(20,fun(21))
?DNA3
?#[1] "cttgcaatgtttaatcgttggagcagt"???????????????????????????????? 
?#[2] "tgcgttatcgcgcagagggccgtgagggat"????????????????????????????? 
?#[3] "ctggccgcatatgcacccacacgtacggcgacgccccatcttgtc"?????????????? 
?#[4] "tcaccagcccttcggaagtat"?????????????????????????????????????? 
?#[5] "gaaccgctggtgtaataacct"?????????????????????????????????????? 
?#[6] "caccaacaagtggattgtcactaattcccctatcagattaagggcgggttgtttgtg"?? 
?#[7] "ggcccaacg"?????????????????????????????????????????????????? 
?#[8] "actgcattcaacggattctgagggttctatataatcactcaataa"?????????????? 
?#[9] "ggattgatattcttaagcactcgcaataaccacctcgcctgccaccatggcaag"????? 
#[10] "actttaactagcttaagccgtaccacttcatct"?????????????????????????? 
#[11] "atagaacag"?????????????????????????????????????????????????? 
#[12] "ttgcatatcccctgagacagttatcgatct"????????????????????????????? 
#[13] "gacaacgatggtcgggtcagggaaaaaatc"????????????????????????????? 
#[14] "tgtgtaactggcaggtctcaacgccttcaaccaatc"??????????????????????? 
#[15] "atcgtcgcacgtgggtatggctaactt"???????????????????????????????? 
#[16] "ataagtcggaaatatggtatccgagtg"???????????????????????????????? 
#[17] "ttttgagcgctagcgaacttatatatatacggatct"??????????????????????? 
#[18] "ttcattatagttttctaaatgcagcagcacagatcaatattttgctctgcttcgttgtcc"
#[19] "cagggtgtactaggacgcgccccactcttgcattcgggc"???????????????????? 
#[20] "agcgacctaccgcccctccaataaagttgtcgttactgagtttcgcgccacgagttgttg"
? 
A.K.





----- Original Message -----
From: Rui Barradas <ruipbarradas at sapo.pt>
To: Ed <beary at geneseo.edu>
Cc: r-help at r-project.org
Sent: Sunday, October 21, 2012 3:50 PM
Subject: Re: [R] Changing a for loop to a function using sapply

Hello,

You're right an _explicit_ for loop is not necessary in your case, but note that the *apply functions are just for loops in disguise. They are also the prefered R idiom.
In this case I've used ?replicate, a function of the *apply family. To be more readable it uses a new function, called iteratively. I believe that the end result looks simpler than the explicit loop version, but that's a matter of taste.


# Changed from character vector to function
random.string <- function(n)
? ? rep(NA, rs <- sample(3:n, 1, replace = TRUE))

# Unchanged
randomizeString <- function(x) {
? ? DNAnucleotides<- c("a","c","g","t")
? ? a <- sample(DNAnucleotides, 3, replace = TRUE)
? ? return(a)
}

# Changed to use function random.string()
DNA <- character(20)
for(i in 1:20)
? ? DNA[i] <- paste(unlist(sapply(random.string(21), randomizeString, simplify = TRUE)), collapse = "")
DNA

# New function. Note the use of lapply, not sapply
fun <- function(n){
? ? paste(unlist(lapply(random.string(n), randomizeString)), collapse = "")
}

DNA2 <- replicate(20, fun(21))
DNA2


Hope this helps,

Rui Barradas
Em 21-10-2012 16:14, Ed escreveu:
> Apparently there is one or more concepts that I do not fully understand from the descriptions of a function and the apply material.?  I have been reading the mail from this forum and have learned much but, in this case, what I have been reading here and from the manual isn't enough.
> The following code produces what I want with the for loop.? From what I have read from this forum, a for loop its not necessarily the best path so I tried to create a function do to the same work.
> 
> Using the following 64 bit version on Windows 7 Dell laptop
> R version 2.15.1 (2012-06-22) -- "Roasted Marshmallows"
> Copyright (C) 2012 The R Foundation for Statistical Computing
> ISBN 3-900051-07-0
> Platform: x86_64-pc-mingw32/x64 (64-bit)
> 
> 
> 
> below is the part that works
> ################################################################################ 
> # The following lines create a string of nucleotides and uses a for loop to create multiple strings.
> # random.string replicate something based on rs sampling criteria.
> 
> random.string <- rep(NA, rs<-sample(3:18,1,replace = TRUE))
> 
> # The randomizeString function uses members of DNAnucleotides list to sample 3 at a time
> # placing the results in "a".
> 
> randomizeString <- function(x) {
>? ?  DNAnucleotides<- c("a","c","g","t")
>? ?  a <-sample(DNAnucleotides,3, replace = TRUE)
>? ?  return(a)
>? ?  }
> 
> # The following paste output uses random.string to indicate the number of times the function
> # randomizeString selects a triplet from the list DNAnucleotides to create a text string
> # of a sequence of nucleotides.
> # collapse = "" removes the quotes from the triplets to produce one long string when the string
> # is printed by paste.
> 
> paste(c(sapply(random.string, randomizeString, simplify = TRUE), ""), collapse = "")
> 
> # The for loop uses the paste output to create multiple random length nucleotide strings
> # which can be printed to a file.
> 
> for(i in 1:20) DNA[i]<-paste(c(sapply(rep(NA, rs<-sample(3:21,1,replace = TRUE))
> , randomizeString, simplify = TRUE), ""), collapse = "")
> DNA
> 
> Rowname <- c(1:20)? ?  # provides row numbers to be used with the sequences produced
> Arrow<- rep(">",20)? ?  # provides a list of ">" to be used to separate the row numbers and sequences
> 
> # DNAout uses a for loop to combine the vectors to create one string vector of sequences.
> 
> DNAout<-class(character)
> for(j in 1:20)DNAout[j]<- paste(Rowname[j]," ",Arrow[j]," ",DNA[j], collapse = "" )
> DNAout
> 
> ################################################################################################ 
> 
> Here is what I have tried in attempts to create a function to replicate the results of the for loop above.
> This one comes close.
> 
> #This repeats the above script without the comments.
> ######
> options(stringsAsFactors=FALSE)
> DNA<-class(character)
> randomizeString <- function(x) {
>? ?  DNAnucleotides <- c("A","C","G","T")
>? ?  a <-sample(DNAnucleotides, 3, replace = TRUE)
>? ?  return(a)
>? ?  }
> for(i in 1:20) DNA[i]<-paste(c(sapply(rep(NA, rs<-sample(3:18,1,replace = TRUE))
> , randomizeString, simplify = TRUE), ""), collapse = "")
> DNA
> Rowname <- c(1:20)
> Arrow<- rep(">",20)
> 
> DNAout<-class(character)
> for(j in 1:20)DNAout[j]<- paste(Rowname[j]," ",Arrow[j]," ",DNA[j], collapse = "" )
> DNAout
> #######
> ##The following works partially
> DNAoutc <- class("character")
> DNAoutc <- function(x,y,z){sapply(x, paste(x," ",y," ",z,"\n", collapse = ""))}
> DNAoutc(Rowname,Arrow,DNA)
> 
> Error in get(as.character(FUN), mode = "function", envir = envir) :
>?  object '1?  >?  ACAAACAATGAGGTCCGCCGGATGAAGCTG
> 2?  >?  CAAACCTCGTGCAAAGGTGCTTCATGGTAAATCCGTTTAGCTTTTCGGGAAAGT
> 3?  >?  TACATCGAAGCTCGTGGGGTGAAG
> 4?  >?  CGTCAACATGAACAAATGACATCCAGACGCACGCTGTAA
> 5?  >?  CATTTAACCCTTGGTGTGATG
> 6?  >?  AAGTATGAGTGGGCCTTGGGTTCTGGCTCCCACGCGTTGTGC
> 7?  >?  AGTTCCCGCAAACTGATACTGATCAGCACTTAGAGACCGCCACTATCAGTT
> 8?  >?  AATAATGCATGCTAGGCAGCCCGCTCGACCATTAGGGATAGAGCT
> 9?  >?  GACATCAAGTCATAGGTT
> 10?  >?  CAGAACAATATACACGTT
> 11?  >?  CGCAACCATCTACACTGCGTT
> 12?  >?  GTGAACTGAGGTATGACCAAAAGGTGGATAATACCCCACGGGACC
> 13?  >?  TAGCAACATGAGTGCCTCAGGTTGTCGTTCAATAAACTCGGGAAG
> 14?  >?  GCGATGATCCGCTTATAGCATGGACAAAGCAACGTTCTGTCGTCGGATTCGGGG
> 15?  >?  AGCATGTTAGCAACCCCTTTG
> 16?  >?  ACTAGTTCTGCCGTCATTTCAATG
> 17?  >?  ATTCTTCCCTTG
> 18?  >?  CATCTCGATTCTTTCTTACAATGT
> 19?  >?  ATAGATACCTTGGTCAAATAATCGTTTCAAGGT
> 20?  >?  GGGGTGGATAATAGCGGATAC
> ' of mode 'function' was not found
> ########################################
> My other attempts essentially give errors which I can not seem to figure out what I am missing to correct the errors.
> Below are a few of the failed attempts.
> #####################################
> 
> mode(DNAoutf)<-("function")
> DNAoutf <-? sapply(x,function(x,y,z){paste(x," ",y," ",z,"\n", collapse = "" )})
> DNAoutf(Rowname,Arrow,DNA)
> 
> > mode(DNAoutf)<-("function")
> Error in mode(DNAoutf) <- ("function") : object 'DNAoutf' not found
> > DNAoutf<- function(x,y,z) {sapply(x,y,z),paste(x," ",y," ",z,"\n", collapse = "" ))}
> Error: unexpected ',' in "DNAoutf<- function(x,y,z) {sapply(x,y,z),"
> > DNAoutf(Rowname,Arrow,DNA)
> Error: could not find function "DNAoutf"
> 
> #######################################
> mode(DNAoutf)<-("function")
> DNAoutf <-? sapply(x,function(x,y,z){paste(x," ",y," ",z,"\n", collapse = "" )})
> DNAoutf(Rowname,Arrow,DNA)
> 
> > mode(DNAoutf)<-("function")
> Error in mode(DNAoutf) <- ("function") : object 'DNAoutf' not found
> > DNAoutf <-? sapply(x,function(x,y,z){paste(x," ",y," ",z,"\n", collapse = "" )})
> Error in paste(x, " ", y, " ", z, "\n", collapse = "") :
>?  argument "y" is missing, with no default
> > DNAoutf(Rowname,Arrow,DNA)
> Error: could not find function "DNAoutf"
> 
> ############################################
> DNAouts(Rowname,Arrow,DNA) <- sapply(x,function(x,y,z){paste(x," ",y," ",z,"\n", collapse = "" )})
> DNAouts
> 
> > DNAouts(Rowname,Arrow,DNA) <- sapply(x,function(x,y,z){paste(x," ",y," ",z,"\n", collapse = "" )})
> Error in paste(x, " ", y, " ", z, "\n", collapse = "") :
>?  argument "y" is missing, with no default
> 
> ##############################################
> DNAouts <- class("character")
> DNAouts <- sapply(x,function(Rowname,Arrow,DNA){paste(x," ",y," ",z,"\n", collapse = "",simplify, USE.NAMES)})
> DNAouts
> 
> > DNAouts
> Error: object 'DNAouts' not found
> > DNAouts <- class("character")
> > DNAouts <- sapply(x,function(Rowname,Arrow,DNA){paste(x," ",y," ",z,"\n", collapse = "",simplify, USE.NAMES)})
> Error in paste(x, " ", y, " ", z, "\n", collapse = "", simplify, USE.NAMES) :
>?  object 'z' not found
> > DNAouts
> [1] "character"
> >
> #######################################################
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.