thanks ted..

being new the R  thsi has been a huge help, espececially on the
Myint=myint thing... I assummed the name was just implicit.

On Sat, May 1, 2010 at 1:19 PM, Ted Harding <ted.hard...@manchester.ac.uk>wrote:

> See below.
>
> On 01-May-10 19:14:08, steven mosher wrote:
> > maybe I can illustrate the problem by showing how a c programmer
> > might think about the problem and the kinds of mistakes 'we' (I)
> > make when trying to do this in R
> >
> >  cstruct<-function(int, bool){
> > +
> > + myint<- int*2;
> > +
> > + mybool<-!bool;
> > + myvec<-rep(mybool,10)
> > + mymat<-matrix(myint*10,nrow=3,ncol=3)
> > + myframe<-data.frame(rep(myint,5),rep(bool,5))
> > + returnlist<-list(myint,mybool,myvec,mymat,myframe)
> > + return(returnlist)
> > +
> > +
> > +
> > + }
> >
> ># so I have a function that returns a list of hetergenous variables.
> ># an int, a bool, a vector of bools, a matrix of ints, a dataframe of
> ># ints and bools
> >
> >> test<-cstruct(3,T)
> >
> >
> >> test
> > [[1]]
> > [1] 6
> >
> > [[2]]
> > [1] FALSE
> >
> > [[3]]
> >  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> >
> > [[4]]
> >      [,1] [,2] [,3]
> > [1,]   60   60   60
> > [2,]   60   60   60
> > [3,]   60   60   60
> >
> > [[5]]
> >   rep.myint..5. rep.bool..5.
> > 1             6         TRUE
> > 2             6         TRUE
> > 3             6         TRUE
> > 4             6         TRUE
> > 5             6         TRUE
> >
> ># Now I want to access the first element of my list which is an
> ># "an int"
> ># first mistake I always make is I just revert to thinking in the
> ># 'dot' structure of a c struct.
> >
> >> test.myint
> > Error: object 'test.myint' not found
> >
> ># Then I think its stored like a var in a dataframe, accessed by
> ># the $
> >> test$myint
> > NULL
> >
> ># then I try to access the first element of the list
> >> test[1]
> > [[1]]
> > [1] 6
> >
> ># That works.. but the [[1]] confuses me when I eval test[1] I want 6
> ># back
> ># again thinking in C.
> ># so I try the third element
> >
> >> test[3]
> > [[1]]
> >  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> >
> ># ok I get my vect of bools back. Now I want the first element
> ># of that thing
> ># well test[3] is that thing.. and I want element 1 of test[3]
> >
> >> test[3][1]
> > [[1]]
> >  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> >
> >#hmm thats not what I expect. I wanted F back.
> ># frustrated I try this which i know is wrong
> >
> >> test[3,1]
> > Error in test[3, 1] : incorrect number of dimensions
> >
> ># crap.. maybe the $ is supposed to be used
> >> test$V3
> > NULL
> >
> ># arrg.. how about 'dot"
> >> test.myvec
> > Error: object 'test.myvec' not found
> >
> >
> > Anyways, That's the kind of frustration. I have a list, third element
> > is a matrix how do I referernce the 2 row 2 colum of the matrix in my
> > list.. for example.
> > and so forth..
>
> When you constructed your return-list, you simply entered the list
> components using the R-names of the objects, as used in the code:
>
>  returnlist<-list(myint,mybool,myvec,mymat,myframe)
>
> To use the "$" extractor, you need to give them "external" names,
> so you could modify the above to:
>
>  returnlist<-list(Myint=myint,Mybool=mybool,
>                   Myvec=myvec,Mymat=mymat,Myframe=myframe)
>
> Then, after
>
>  test<-cstruct(3,T)
>
> you can access test$Myint, test$mybool, etc.; and, in particular,
> test$Mymat will be the matrix mymat you put in there, so you
> can extract elements of this using
>
>  test$Mymat[2,2]
>
> for the element in row 2, column 2, and so on. Without making
> the return-list a named list, its components have no names,
> so then test$mymat (as you did) will not work because there
> is no component with name "mymat" (there is no component with
> any name). The name "mymat" was used by R to identify the
> object whose contents were to be placed in the list; that
> internal object-name does not get placed in the list.
>
> Note: In my modification above I used "Myint=myint" etc. instead
> of "myint=myint" to highlight the distinction between the
> component-name and the object-name. But you can just as well
> use exactly the same name for component-name as for object-name:
> R will recognise them as distinct and do the right thing.
> So you could just as well do:
>
>  returnlist<-list(myint=myint,mybool=mybool,
>                   myvec=myvec,mymat=mymat,myframe=myframe)
>
> and then, after
>
>  test<-cstruct(3,T)
>
> do
>
>  test$Mymat[2,2]
>
> You can also use positional references if the list components have
> no names. Since your "mymat" is in position 4,
>
>  test[[4]]
>
> would return the whole matrix. Then
>
>  test[[4]][2,2]
>
> would return the element in row 2, column 2.
>
> As a standard example, try for instance
>
>  X  <- 0.1*((-10):10)
>  Y  <- 0.5*X + 0.2*rnorm(length(X))
>  LM <- lm(Y ~ X)
>
>  summary(LM)
>  # Call:
>  # lm(formula = Y ~ X)
>  # Residuals:
>  #       Min        1Q    Median        3Q       Max
>  # -0.373283 -0.083458  0.009206  0.139763  0.278242
>  # Coefficients:
>  #             Estimate Std. Error t value Pr(>|t|)
>  # (Intercept) -0.06018    0.04448  -1.353    0.192
>  # X            0.46270    0.07345   6.299 4.78e-06 ***
>  # ---
>  # Signif. codes:  0 ?***? 0.001 ?**? 0.01 ?*? 0.05 ?.? 0.1 ? ? 1
>  # Residual standard error: 0.2038 on 19 degrees of freedom
>  # Multiple R-squared: 0.6762,     Adjusted R-squared: 0.6592
>  # F-statistic: 39.68 on 1 and 19 DF,  p-value: 4.784e-06
>
> Suppose you just wanted the Estimates and P-values. Then
>
>  summary(LM)$coef[,c(1,4)]
>  #                Estimate     Pr(>|t|)
>  # (Intercept) -0.06018002 1.919241e-01
>  # X            0.46269824 4.783990e-06
>
> The component $coef of summary(LM) is a matrix, so the above
> extracts its first and fourth columns.
>
> Alternatively, similarly to the positional extraction shown
> for your "test" list:
>
>  summary(LM)[[4]][,c(2,4)]
>  #             Std. Error     Pr(>|t|)
>  # (Intercept) 0.04447759 1.919241e-01
>  # X           0.07345233 4.783990e-06
>
> Since LM is of class lm ("linear model"), summary(LM) sees this and
> calls the method summary.lm; this returns a list, and to find out
> what's in it have a look at
>
>  ?summary.lm
>
> under "Value:"
>
>  "The function 'summary.lm' computes and returns a list of summary
>  statistics of the fitted linear model given in ?object?, using the
>  components (list elements) '"call"' and '"terms"' from its
>  argument, plus
>  [...]
>  coefficients: a p x 4 matrix with columns for the estimated
>    coefficient, its standard error, t-statistic and corresponding
>    (two-sided) p-value.  Aliased coefficients are omitted.
>  [...]"
>
> And so on. ("coefficients" is, by implication from '?summary.lm',
> in position 4 in the list -- just like your "mymat", as it happens!)
>
> Ted.
>
> > On Sat, May 1, 2010 at 10:56 AM, Ted Harding
> > <ted.hard...@manchester.ac.uk>wrote:
> >
> >> On 01-May-10 16:58:49, Giovanni Azua wrote:
> >> >
> >> > On May 1, 2010, at 6:48 PM, steven mosher wrote:
> >> >> I was talking with another guy on the list about this very topic.
> >> >>
> >> >> A simple example would help.
> >> >>
> >> >> first a sample C struct, and then how one would do the equivalent
> >> >> in
> >> >> R.
> >> >>
> >> >> In the end i suppose one want to do a an 'array' of these structs,
> >> >> or
> >> >> list
> >> >> of the structs.
> >> >
> >> > Or like in my use-case ... I needed a c-like struct to define the
> >> > type
> >> > for aggregating the data to return from a function.
> >> >
> >> > Best regards,
> >> > Giovanni
> >>
> >> Assuming that I understand what you want, this is straightforward
> >> and can be found throughout the many functions available in R.
> >> The general form is:
> >>
> >>  myfunction <- function(...){
> >>    <code to compute objects A1, A2, ... , An>
> >>    list(valA1=A1, valA2=A2, ... , valAn=An)
> >>  }
> >>
> >> and then a call like
> >>
> >>  myresults <- myfunction(...)
> >>
> >> will create a list "myresults" with compnents "valA1", ... ,"valAn"
> >> which you can access as desired on the lines of
> >>
> >>  myresults$valA5
> >>
> >> As a simple example, the following is a function which explores
> >> by simulation the power of the Fisher Exact Test for comparing
> >> two proportions in a 2x2 table:
> >>
> >>  power.fisher.test <- function(p1,p2,n1,n2,alpha=0.05,nsim=100){
> >>    y1 <- rbinom(nsim,size=n1,prob=p1)
> >>    y2 <- rbinom(nsim,size=n2,prob=p2)
> >>    y <- cbind(y1,n1-y1,y2,n2-y2)
> >>    p.value <- rep(0,nsim)
> >>    for (i in 1:nsim)
> >>      p.value[i] <- fisher.test(matrix(y[i,],2,2))$p.value
> >>    list(Pwr=mean(p.value < alpha),SE.Pwr=sd(p.value <
> >>    alpha)/sqrt(nsim))
> >>  }
> >>
> >> So, given two binomials B(n1,p1) and B(n2,p2), what would be the
> >> power of the Fisher test to detect that p1 was different from p2,
> >> at given significance level alpha? This is investigated by repeating,
> >> nsim times:
> >>  sample from Bin(n1,p1), sample from Bin(n2.p2)
> >>  do a Fisher test and get its P-value; store it
> >>    in a vector p.value of length nsim
> >> and then finally:
> >>  estimate the power as the proportion Pwr of the nsim cases
> >>    in which the P-value was less than alpha
> >>  get the SE of this estimate
> >>  return these two values as components Pwr and SE.Pwr of a list
> >>
> >> As it happens, here each component of the resulting list is of
> >> the same type (a single number); but in a different computation
> >> each component (and of course there could be more than two)
> >> could be anything -- even another list. So you can have lists
> >> of lists ... !
> >>
> >> Thus, instead of the simple returned list above:
> >>
> >>  list(Pwr=mean(p.value < alpha),
> >>       SE.Pwr=sd(p.value < alpha)/sqrt(nsim))
> >>
> >> you could have
> >>
> >>  list(Binoms=list(Bin1=list(size=n1,prob=p1),
> >>                   Bin2=list(size=n2,prob=p2))
> >>       Pwr=mean(p.value < alpha),
> >>       SE.Pwr=sd(p.value < alpha)/sqrt(nsim))
> >>
> >> thus also returning the details of the Binomials for which the
> >> simulation was carried out. You could access these all together as:
> >>
> >>  power.fisher.test(...)$Binoms
> >>
> >> or separately as
> >>
> >>  power.fisher.test(...)$Binoms$Bin1
> >> or
> >>  power.fisher.test(...)$Binoms$Bin2
> >>
> >> or even
> >>  power.fisher.test(...)$Binoms$Bin1$size
> >>  power.fisher.test(...)$Binoms$Bin1$prob
> >> etc.
> >>
> >> Ted.
> >>
> >> --------------------------------------------------------------------
> >> E-Mail: (Ted Harding) <ted.hard...@manchester.ac.uk>
> >> Fax-to-email: +44 (0)870 094 0861
> >> Date: 01-May-10                                       Time: 18:56:50
> >> ------------------------------ XFMail ------------------------------
> >>
> >> ______________________________________________
> >> 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.
>
> --------------------------------------------------------------------
> E-Mail: (Ted Harding) <ted.hard...@manchester.ac.uk>
> Fax-to-email: +44 (0)870 094 0861
> Date: 01-May-10                                       Time: 21:18:59
> ------------------------------ XFMail ------------------------------
>

        [[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.

Reply via email to