On Oct 4, 2009, at 3:40 AM, Tim Clark wrote:

David,

Thanks!  You just gave me the answer.  All I had to do was:

xx<-c()
for (i in c('100', '75', '50') )
{
x<-homerange[[1]]$polygons[[i]] ; xx<-rbind(x,xx)
}
xx

I didn't know you could use characters as index values in a for loop, or that you could use characters in double brackets instead of using the $ symbol.

Looping over vectors or lists is pretty common. Sometimes you will want to assign their sequence number in which case the loop would look like:

for (i in seq_along(c(100', '75', '50') ) { }


homerange[[1]]$polygons[['100']]
is the same as
homerange[[1]]$polygons$'100

Only if you match the quotes (at least on my version of R), and even that was a bit of a surprise to me. The "[[" indexing is the more fundamental extraction operator and is more flexible in the loop situation.

The list is actually the output of the NNCH function in Adehabitat. I thought about changing the function first, but looked at the code and couldn't figure it out. I knew there had to be an easier way.

I greatly appreciate all your help,

Tim

Tim Clark
Department of Zoology
University of Hawaii


--- On Sat, 10/3/09, David Winsemius <dwinsem...@comcast.net> wrote:

From: David Winsemius <dwinsem...@comcast.net>
Subject: Re: [R] Paste a character to an object
To: "Tim Clark" <mudiver1...@yahoo.com>
Cc: r-help@r-project.org
Date: Saturday, October 3, 2009, 5:43 PM

On Oct 3, 2009, at 11:14 PM, Tim Clark wrote:

David,

Thanks, that helps me in making an example of what I
am trying to do.  Given the following example, I would
like to run through a for loop and obtain a vector of the
data only for the 100, 75, and 50 percent values.  Is
there a way to get this to work, either using paste as in
the example below or some other method?

homerange <- list()
homerange[[1]] <- "test"
homerange[[1]]$polygons <- "test2"
homerange[[1]]$polygons$`100` <- rnorm(20,10,1)
homerange[[1]]$polygons$`90` <- rnorm(20,10,1)
homerange[[1]]$polygons$`75` <- rnorm(20,10,1)
homerange[[1]]$polygons$`50` <- rnorm(20,10,1)

xx<-c()
percent<-c("100","75","50")
for (i in 1:length(percent))
{
x<-paste(homerange[[1]]$polygons$
,    percent[i]) #This does not work!!!


  ^?^
And why _would_ you expect an expression ending in a "$" to
be acceptable to the parser? You did not put quotes around
it so the interpreter tried to evaluate it.

You are probably looking for the capabilities of the
functions get and assign which take string variable and
either get the object named by a sstring or assign a vlaue
to an object so named.

But why are you intent in causing yourself all this
pain?  (Not to mention asking questions I cannot
answer.)  Working with expressions involving backquotes
is a recipe for hair-pulling and frustration for us normal
mortals. Why not call your lists "p100", "p90", "p75",
"p50"? Then everything is simple:

xx<-c()
percent<-c(100, 75, 50)
for (i in c("p100", "p75", "p50") )
+ {
+ x<-homerange[[1]]$polygons[[i]] ;
xx<-rbind(x,xx)  # could have simplified this
+ }
xx
       [,1]
   [,2]     [,3]
    [,4]     [,5]
  [,6]      [,7]
[,8]     [,9]
x  9.660935 10.46526 10.75813  8.866064
9.967950  9.987941 10.757160 10.180826 9.992162
x 11.674645 10.51753 10.88061 10.515120 9.440838 11.460845
12.033612  9.318392 9.592026
x 10.057021 10.14339 10.29757  9.164233 8.977280
9.733971  9.965002  9.693649 9.430043
     [,10]
   [,11]     [,12]
   [,13]     [,14]
   [,15]     [,16]
   [,17]    [,18]
x 11.78904  9.437353 11.910747 10.996167
11.631264  9.386944  9.602160 10.498921
9.09349
x  9.11036  9.546378 11.030323
9.715164  9.500268 11.762440  9.101104
9.610251 10.56210
x  9.62574 12.738020  9.146863 10.497626
10.485520 11.644503 10.303581 11.340263 11.34873
      [,19]     [,20]
x 10.146955  9.640136
x  9.334912 10.101603
x  8.710609 11.265633






The x<-paste(...) in this function does not work,
and that is what I am stuck on.  The result should be a
vector the values for the "100","75",and "50" levels, but
not the "90" level.

Aloha,

Tim Clark
Department of Zoology
University of Hawaii


--- On Sat, 10/3/09, David Winsemius <dwinsem...@comcast.net>
wrote:

From: David Winsemius <dwinsem...@comcast.net>
Subject: Re: [R] Paste a character to an object
To: "Tim Clark" <mudiver1...@yahoo.com>
Cc: r-help@r-project.org
Date: Saturday, October 3, 2009, 4:45 PM

On Oct 3, 2009, at 10:26 PM, Tim Clark wrote:

Dear List,

I can't seem to get a simple paste function to
work
like I need.  I have an object I need to call
but it
ends in a character string.  The object is a
list of
home range values for a range of percent
isopleths.  I
need to loop through a vector of percent values,
so I need
to paste the percent as a character on the end of
the object
variable.  I have no idea why the percent is
in
character form, and I can't use a simple index
value
(homerange[[1]]$polygons[100]) because there are a
variable
number of isopleths that are calculated and [100]
will not
always correspond to "100".  So I am stuck.

What I want is:

homerange[[1]]$polygons$"100"

What I need is something like the following,
but that
works:

percent<-c("100","75","50")
p=1

paste(homerange[[1]]$polygons$,percent[p],sep="")

Not a reproducible example, but here is some code
that
shows that it is possible to construct names that
would
otherwise be invalid due to having numerals as a
first
character by using back-quotes:

percent<-c("100","75","50")
p=1

paste(homerange[[1]]$polygons$,percent[p],sep="")
Error: syntax error
homerange <- list()
homerange[[1]] <- "test"
homerange[[1]]$polygons <- "test2"
Warning message:
In homerange[[1]]$polygons <- "test2" :
Coercing LHS to
a list
homerange
[[1]]
[[1]][[1]]
[1] "test"

[[1]]$polygons
[1] "test2"


homerange[[1]]$polygons$`100` <-
percent[1]
Warning message:
In homerange[[1]]$polygons$`100` <- percent[1]
:
Coercing LHS to a list
homerange[[1]]$polygons$`100`
[1] "100"

--David Winsemius



Thanks for the help,

Tim



Tim Clark
Department of Zoology
University of Hawaii


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






David Winsemius, MD
Heritage Laboratories
West Hartford, CT






David Winsemius, MD
Heritage Laboratories
West Hartford, CT

______________________________________________
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