[R] Paste a character to an object

David Winsemius dwinsemius at comcast.net
Sun Oct 4 11:09:34 CEST 2009


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 <dwinsemius at comcast.net> wrote:
>
>> From: David Winsemius <dwinsemius at comcast.net>
>> Subject: Re: [R] Paste a character to an object
>> To: "Tim Clark" <mudiver1200 at yahoo.com>
>> Cc: r-help at 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 <dwinsemius at comcast.net>
>> wrote:
>>>
>>>> From: David Winsemius <dwinsemius at comcast.net>
>>>> Subject: Re: [R] Paste a character to an object
>>>> To: "Tim Clark" <mudiver1200 at yahoo.com>
>>>> Cc: r-help at 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 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.
>>>>
>>>>
>>>
>>>
>>>
>>
>> David Winsemius, MD
>> Heritage Laboratories
>> West Hartford, CT
>>
>>
>
>
>

David Winsemius, MD
Heritage Laboratories
West Hartford, CT




More information about the R-help mailing list