[R] Dynamic regex/sub changes to function

Daniel Fuka drf28 at cornell.edu
Mon Sep 22 17:34:48 CEST 2014

Howdy Duncan,

Thanks for the quick reply!  I must be missing something
simple/obvious. I need to have the "sub()" not return quoted and
escaped characters to "just edit the language expression". In my
problem, there is a function that is supported from a different
package. So I always want to use the supported function as my base...
but a url in the supported function needs to be changed dynamically
for my application, which is easiest using "sub()".

I am trying to do what you correctly indicate I would need to do:
"just edit the language expression that body(fsong) gives you, and
assign it back"
BUT, using sub, I get back a quoted string in my example if I just use sed:

> fsong
 song=paste("my name is fuka,",x)
# Using "sub()" becomes:
> nsong
function (x)
    "song = paste(\"my name is muka,\", x)"

Thanks again for the quick reply and help you are giving me!

On Mon, Sep 22, 2014 at 10:37 AM, Duncan Murdoch
<murdoch.duncan at gmail.com> wrote:
> On 22/09/2014 9:16 AM, Daniel Fuka wrote:
>> Howdy,
>> I have searched the lists and can not seem to find a solution to my
>> problem. I need to be able to dynamically modify a string inside a
>> function to build a new function. "sub" replaces with a quoted
>> string... and "parse" of "sub" returns expression... How can I get an
>> unquoted string from a regex to stick into a "body" of a function?
> It's possible to do what you want, though you don't want to be using
> parse(), you can just edit the language expression that body(fsong) gives
> you, and assign it back.  But that's a messy way to solve your problem.
> Why not create a new function containing the new string?  e.g.
> makefsong <- function(name = "fuka") {
>   line1 <- paste("my name is", name)
>   function(x) {
>     song <- paste(line1, x)
>     return(song)
>   }
> }
> f1 <- makefsong()
> f1("I live on the second floor")
> f2 <- makefsong("muka")
> f2("I live on the second floor")
> Duncan Murdoch
>> Thanks for your help!
>> dan
>> # Original Function
>> fsong=function(x){
>>   song=paste("my name is fuka,",x)
>>   return(song)
>> }
>> fsong("I live on the second floor")
>> #
>> # Copy and modify using "sub" returns quoted string with escaped quotes
>> #   internally... as expected.. which can not be evaluated.
>> nsong=fsong
>> body(nsong)[[grep("fuka",body(nsong))]]=
>>     sub("fuka","muka",list(body(fsong)[[grep("fuka",body(fsong))]]))
>> nsong("I live on the second floor") # broken
>> #
>> # Copy and modify with "parse" of  "sub",  returns expression.. but
>> without quotes,
>> # o getting closer.
>> #
>> nsong=fsong
>> body(nsong)[[grep("fuka",body(nsong))]]=
>> parse(text=sub("fuka","muka",list(body(fsong)[[grep("fuka",body(fsong))]])))
>> ______________________________________________
>> 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