[R] How to use a variable after $ ($x) for subscripting a list, How to source from a character object (source(x))

Duncan Murdoch murdoch.duncan at gmail.com
Tue Sep 13 15:09:12 CEST 2011


On 13/09/2011 8:50 AM, drflxms wrote:
> Thank you very much!
>
> foreach(i=1:length(levels)) %do% {listResult[[i]][[input]]} (instead of
> listResult[[i]]$input) does the trick!!!

If both i and input were the same type (numeric or character), you could 
also use

listResult[[c(i, input)]]

This style is useful when the depth of the list varies.

Duncan Murdoch
> Sorry for being a little bit confuse in describing the problem.
> My example object listResult is meant to be a list-object with several
> levels. More concrete: it contains the output of confusionMatrix
> function from library(caret) as well as other output for several
> confusion matrices.
> Hope, this is a little bit clearer now?
>
> Thank you very much for your examples, which help me to understand how
> to program similar problems.
>
> Thanx and all the best, happy Felix
>
> Am 13.09.11 10:29, schrieb R. Michael Weylandt:
> >  I had a little bit of trouble following what exactly you mean to do
> >  (specifically, I'm having a little bit of trouble understanding your sample
> >  object "listResult" -- is it a list or a set of factors or a list of lists
> >  or something else entirely), but I believe that replacing the `$` operator
> >  with additional copies of  `[` or `[[` as appropriate should get the job
> >  done. $ is, for almost all purposes, a less flexible version of `[[`.
> >
> >  Consider the following:
> >
> >  R>  a = list(a1 = rnorm(5), rnorm(6), rnorm(7))
> >  R>  b = list(runif(5), b2 = runif(6), runif(7))
> >  R>  c = list(-runif(5), -runif(6), c3 = -runif(7))
> >
> >  R>  A = list(a = a,b = b,c = c)
> >
> >  R>  for( i in seq_along(A)) { print(A[[i]][[3]][i]) }
> >
> >  which seems to work for me (even if it is frustratingly opaque as to its
> >  function). Specifically,
> >
> >  R>  identical(A$a, A[["a"]])
> >  TRUE
> >
> >  R>  identical(A$a,A[[1]])
> >  TRUE
> >
> >  If this doesn't work, please clarify what exactly the object you have is and
> >  what you are trying to get out of it and I'll give a more concrete answer.
> >
> >  On Tue, Sep 13, 2011 at 4:11 AM, drflxms<drflxms at googlemail.com>  wrote:
> >
> >>  Dear R colleagues,
> >>
> >>  as result of a function a huge list is generated. From this result list
> >>  I'd like to extract information.
> >>
> >>  Think of the list i.e. as an object named "listResult" with the
> >>  following form:
> >>
> >>  [[a]]
> >>   [1] [2] [3] [4] [5]
> >>
> >>  [[b]]
> >>   [1] [2] [3] [4] [5]
> >>
> >>  [[c]]
> >>   [1] [2] [3] [4] [5]
> >>
> >>  where levels=c(a,b,c)
> >>
> >>  I'd like to extract a data.frame like
> >>
> >>  a [2]
> >>  b [2]
> >>  c [2]
> >>
> >>  What I tried, is a function like this:
> >>
> >>  library(foreach)
> >>  loopExtract<- function(input) {
> >>  foreach(i=1:length(levels)) %do% {listResult[[i]]$input}
> >>  ...
> >>
> >>  where the name of the variable [2] is meant to be the input.
> >>
> >>  Unfortunately it turned out, that the "input"-variable after the $ is
> >>  not substituted as expected. Subscripting the list with a variable after
> >>  the $ seems not possible.
> >>  The only workaround I found for that is a function like
> >>
> >>  loopExtract<- function(input) {
> >>  codetemplate<- as.character("result<- foreach(i=1:length(levels)) %do%
> >>  {listResult[[i]]$input)}")
> >>  require(stringr)
> >>  write(str_replace_all(codetemplate, "input", input), file="tmp.r")
> >>  source("tmp.r")
> >>  return(result)
> >>  }
> >>
> >>  in other words I stored a template of the desired code as characters in
> >>  an object, substituted the "input" string in that character object,
> >>  wrote the result to a file and sourced the code of that file.
> >>
> >>  I stored the result in a file cause the expression source(codetemplate)
> >>  did not work. From the documentation I learned, that one can only source
> >>  "connections". And there seems no chance to establish a connection to an
> >>  object. (Probably no one else, except me, has such a strange idea.)
> >>
> >>  Well, it works that way, but even though I am not a real programmer, I
> >>  realize how dirty this solution is. There must be a much simpler and
> >>  elegant way.
> >>
> >>  To sum it all up, my problem can be reduced to the following two questions
> >>
> >>  (1) How to subscript a list with a variable after $
> >>  (2) How to source from an object containing a code template
> >>  or (probably the most promising) (3) How to avoid both ;)
> >>
> >>  Unfortunately I am not experienced enough to find the solution. Please
> >>  help!
> >>
> >>  Greetings from sunny Munich, Felix
> >>
> >>  ______________________________________________
> >>  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.



More information about the R-help mailing list