I appreciate all the help and patience. My pea sized brain had yet to grasp
the concept of a function return. results<-function() absolutely works. i
wanted it in a dataframe to most easily transfer it to a database. Ive found
the Rpostgres like data frames better. Im sure a character vector would
works better, i will have to look at it. As you could tell from my code,
this is a little new to me but thanks for all your help. Much to learn.

John

On Thu, May 12, 2011 at 7:47 PM, William Dunlap <wdunlap@tibco.com> wrote:

> Your question concerned how to return data from a function.
> It looks like you are using the following idiom
> to save the data a function generates:
>  f <- function() {
>     result <- ... some calculations ...
>     save(result, file="result.Rdata")
>  }
>  load("result.Rdata")
>  ... now you will find a dataset called "result" ...
> The save call stores f's local dataset called 'result' in
> a file and the load call loads the data from the file into
> a dataset also called result but in a different frame
> (the frame of the caller of f, not f's frame).
>
> Don't use save() and load() for this sort of thing.
> It will mystify people reading your code and make the
> code difficult to reuse.
>
> Instead return the value of f's result from f and
> use the assignment operator when calling f to store
> that return value in the caller's frame:
>  f <- function() {
>     fResult <- ... some calculations ...
>     fResult # the return value of f
>  }
>  result <- f()
> When f is finished all variables in it disappear and its
> return value is passed back to its caller, who can name it or
> use it directly in another function call.
>
> You didn't ask about the following, but the code
>   results <- as.data.frame(1)
>   j <- 0
>  for (i in 1:length(kyphosis$Kyphosis)) {
>    if (((kyphosis$Kyphosis[i]=="absent")==(prediction[i,1]==1)) == 0 ){
>      j <- j+1
>       results[j,] <- row.names(kyphosis[c(i),])
>    }
>  }
> may be written without the for loop as
>  isMisclassified <- ((kyphosis$Kyphosis=="absent") ==
> (prediction[,1]==1)) == 0
>  results <- data.frame("1" = rownames(kyphosis)[isMisclassified],
> check.names=FALSE, stringsAsFactors=FALSE)
> Note the the isMisclassified<- line is your line with
> the subscripts 'i' taken out, as we want to evaluate the condition for
> all i.
> I find the intent of that easier to understand than that
> of the code in the for loop.
>
> I don't know why you want 'results' to be a data.frame instead
> of a simple character vector; the expression
>  rownames(kyphosis)[isMisclassified]
> would give you that.
>
> Also, since 'i' is an integer,
>  c(i)
> is just a long-winded way of saying
>  i
>
> The test
>  logicalValue == 0
> really ought to have the same type of data on both sides
> of the ==, as in
>  logicalValue == FALSE
> or, even better in this case,
>  !logicalValue # bang means not
> or, since logicalValue is x==y you could replace !(x==y) with
>  x != y
> so the following is equivalent to what you wrote
>  isMisclassified <- (kyphosis$Kyphosis=="absent") !=
> (prediction[,1]==1)
> (and, in my opinion, the latter is easier to understand).
>
> Finally, you defined a function of one argument, x, and didn't
> use the argument.  Functions don't need arguments,
>   f <- function() {
>      ....
>   }
> would do just as well.
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
> > -----Original Message-----
> > From: r-help-bounces@r-project.org
> > [mailto:r-help-bounces@r-project.org] On Behalf Of John Dennison
> > Sent: Thursday, May 12, 2011 2:41 PM
> > To: r-help@r-project.org
> > Subject: Re: [R] Saving misclassified records into dataframe
> > within a loop
> >
> > Having poked the problem a couple more times it appears my
> > issue is that the
> > object i save within the loop is not available after the
> > function ends. I
> > have no idea why it is acting in this manner.
> >
> >
> > library(rpart)
> >
> > # grow tree
> > fit <- rpart(Kyphosis ~ Age + Number + Start,
> >  method="class", data=kyphosis)
> > #predict
> > prediction<-predict(fit, kyphosis)
> >
> > #misclassification index function
> >
> > results<-as.data.frame(1)
> >
> > predict.function <- function(x){
> >   j<-0
> > for (i in 1:length(kyphosis$Kyphosis)) {
> > if (((kyphosis$Kyphosis[i]=="absent")==(prediction[i,1]==1)) == 0 ){
> >
> >  j<-j+1
> > results[j,]<-row.names(testing[c(i),])
> > print( row.names(kyphosis[c(i),]))
> > } }
> > {
> > print(results)
> > save(results, file="results") } }
> >
> >
> > i can load results from file and my out put is there. how
> > ever if i just
> > type results i get the original 1. what is in the lords name
> > is occurring.
> >
> > Thanks
> >
> > John
> >
> >
> >
> > On Thu, May 12, 2011 at 1:50 PM, Phil Spector
> > <spector@stat.berkeley.edu>wrote:
> >
> > > John -
> > >   In your example, the misclassified observations (as defined by
> > > your predict.function) will be
> > >
> > >  kyphosis[kyphosis$Kyphosis == 'absent' & prediction[,1] != 1,]
> > >
> > > so you could start from there.
> > >                                        - Phil Spector
> > >                                         Statistical
> > Computing Facility
> > >                                         Department of Statistics
> > >                                         UC Berkeley
> > >                                         spector@stat.berkeley.edu
> > >
> > >
> > >
> > > On Thu, 12 May 2011, John Dennison wrote:
> > >
> > >  Greetings R world,
> > >>
> > >> I know some version of the this question has been asked
> > before, but i need
> > >> to save the output of a loop into a data frame to
> > eventually be written to
> > >> a
> > >> postgres data base with dbWriteTable. Some background. I
> > have developed
> > >> classifications models to help identify problem accounts.
> > The logic is
> > >> this,
> > >> if the model classifies the record as including variable X
> > and it turns
> > >> out
> > >> that record does not have X then it should be reviewed(ie
> > i need the row
> > >> number/ID saved to a database). Generally i want to look at the
> > >> misclassified records. This is a little hack i know,
> > anyone got a better
> > >> idea please let me know. Here is an example
> > >>
> > >> library(rpart)
> > >>
> > >> # grow tree
> > >> fit <- rpart(Kyphosis ~ Age + Number + Start,
> > >>  method="class", data=kyphosis)
> > >> #predict
> > >> prediction<-predict(fit, kyphosis)
> > >>
> > >> #misclassification index function
> > >>
> > >> predict.function <- function(x){
> > >> for (i in 1:length(kyphosis$Kyphosis)) {
> > >> #the idea is that if the record is "absent" but the prediction is
> > >> otherwise
> > >> then show me that record
> > >> if
> > (((kyphosis$Kyphosis[i]=="absent")==(prediction[i,1]==1)) == 0 ){
> > >>  #THIS WORKS
> > >> print( row.names(kyphosis[c(i),]))
> > >> }
> > >> } }
> > >>
> > >> predict.function(x)
> > >>
> > >> Now my issue is that i want to save these id to a
> > data.frame so i can
> > >> later
> > >> save them to a database. This this an incorrect approach.
> > Can I save each
> > >> id
> > >> to the postgres instance as it is found. i have a ignorant
> > fear of lapply,
> > >> but it seems it may hold the key.
> > >>
> > >>
> > >> Ive tried
> > >>
> > >> predict.function <- function(x){
> > >> results<-as.data.frame(1)
> > >> for (i in 1:length(kyphosis$Kyphosis)) {
> > >> #the idea is that if the record is "absent" but the prediction is
> > >> otherwise
> > >> then show me that record
> > >> if
> > (((kyphosis$Kyphosis[i]=="absent")==(prediction[i,1]==1)) == 0 ){
> > >>  #THIS WORKS
> > >> results[i,]<- as.data.frame(row.names(kyphosis[c(i),]))
> > >> }
> > >> } }
> > >>
> > >> this does not work. results object does not get saved. Any
> > Help would be
> > >> greatly appreciated.
> > >>
> > >>
> > >> Thanks
> > >>
> > >> John Dennison
> > >>
> > >>        [[alternative HTML version deleted]]
> > >>
> > >> ______________________________________________
> > >> R-help@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.
> > >>
> > >>
> >
> >       [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-help@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.
> >
>

	[[alternative HTML version deleted]]

