Skip to content

Changing function arguments

4 messages · McGehee, Robert, Charles C. Berry, Gabor Grothendieck +1 more

#
R-Developers,
I'm looking for some help computing on the R language.

I'm hoping to write a function that parses a language or expression
object and returns another expression with all instances of certain
argument of a given function altered. For instance, say I would like my
function, myFun to take an expression and whenever the argument 'x'
appears within the function FUN inside that expression, return an
altered expression in which 'x' is incremented by one.

Thus,
[1] expression(FUN(x = 1) + log(FUN(x = 4)))

Conceptually, it looks like I want to recursively break a language
object into its component functions, search for FUN and increment one of
its arguments ('x'), then reassemble and return the resulting
expression. However, I haven't been able to come up with a clean way to
do this. Suggestions would be greatly appreciated.

Thanks in advance,
Robert

Robert McGehee
Quantitative Analyst
Geode Capital Management, LLC
53 State Street, 5th Floor | Boston, MA | 02109
Tel: 617/392-8396    Fax:617/476-6389
mailto:robert.mcgehee at geodecapital.com



This e-mail, and any attachments hereto, are intended for us...{{dropped}}
#
See

 	?body
 	?parse
 	?deparse
 	?gsub
[1] 4.2
y + foo(x = 1) + foo(x = 2)
[1] 6.2
y + foo(x = 1 + 1) + foo(x = 1 + 2)
There are many, many ways to skin this cat.

The 'parse( text = ... )' is but one.

Operating on parsed objects without deparsing them is often 
preferred.
On Sun, 22 Oct 2006, McGehee, Robert wrote:

            
Charles C. Berry                        (858) 534-2098
                                          Dept of Family/Preventive Medicine
E mailto:cberry at tajo.ucsd.edu	         UC San Diego
http://biostat.ucsd.edu/~cberry/         La Jolla, San Diego 92093-0717
#
Try this.  If the first arg of FUN is x then it increments it.

incrx <- function (e) {
    is.node <- function(x) is.symbol(x) || is.double(x)
    if (is.node(e)) return(e)
    if (is.name(e[[1]]) && e[[1]] == as.name("FUN") && names(e)[2] == "x")
        e[[2]] <- e[[2]] + 1
    for (i in 1:length(e)) e[[i]] <- incrx(e[[i]])
    return(e)
}

incrx(expression(FUN(x = 0) + log(FUN(x = 3))))
On 10/22/06, McGehee, Robert <Robert.McGehee at geodecapital.com> wrote:
#
On Sun, 22 Oct 2006, McGehee, Robert wrote:

            
This sort of recursive parsing and modification is done by the bquote() 
function, so you could look there.

     -thomas

Thomas Lumley			Assoc. Professor, Biostatistics
tlumley at u.washington.edu	University of Washington, Seattle