String replacement in an expression
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)