[R] String replacement in an expression

Wacek Kusnierczyk Waclaw.Marcin.Kusnierczyk at idi.ntnu.no
Fri May 29 08:26:08 CEST 2009


William Dunlap wrote:
> Bill Dunlap
> TIBCO Software Inc - Spotfire Division
> wdunlap tibco.com  
>
>   
>> -----Original Message-----
>> From: r-help-bounces at r-project.org 
>> [mailto:r-help-bounces at r-project.org] On Behalf Of Wacek Kusnierczyk
>> Sent: Thursday, May 28, 2009 12:31 PM
>> To: Caroline Bazzoli
>> Cc: r-help at r-project.org
>> Subject: Re: [R] String replacement in an expression
>>
>> Caroline Bazzoli wrote:
>>     
>>> Dear R-experts,
>>>
>>> I need to replace in an expression the character "Cl" by "Cl+beta"
>>>
>>> But in the following case:
>>>
>>> form<-expression((Cl-(V *ka)  ) +(V   *Vm   *exp(-(Clm/Vm)   *t)))
>>>
>>> gsub("Cl","(Cl+beta)",as.character(form))
>>>
>>> We obtain:
>>>
>>> [1] "((Cl+beta) - (V * ka)) + (V * Vm * exp(-((Cl+beta)m/Vm) * t))"
>>>
>>>
>>> the character "Clm" has been also replaced.
>>>
>>>
>>> How could I avoid this unwanted replacement ?
>>>       
>> try '\\bCl\\b' as the pattern, which says 'match Cl as a 
>> separate word'.
>>     
>
> That works in this case, but \\b idea of what a word is not
> same as R's idea of what a name is.  E..g, \\b thinks that
> a period is not in a word but R thinks periods in names are
> fine.
>   

yes, that's right.  i was tuned to the particular example given by the op.

vQ


>    > gsub("\\bC1\\b", "(C1+beta)", "C1 * exp(C1.5 / C2.5)")
>    [1] "(C1+beta) * exp((C1+beta).5 / C2.5)"
> This is one more reason to use substitute(), which directly
> edits an expression to produce a new one.  It avoids
> the deparse-edit-parse cycle that can corrupt things
> (even if you don't do any editing).
>    > substitute(C1 * exp(C1.5 / C2.5), list(C1=Quote(C1+beta)))
>    (C1 + beta) * exp(C1.5/C2.5)
>




More information about the R-help mailing list