On Thu, 2011-04-28 at 23:08 -0400, Chee Chen wrote:
> Dear All,
> I would like to define a function: f(x,y,z) with three arguments x,y,z, such 
> that: given values for x,y,  f(x,y,z) is still a function of z and that I am 
> still allowed to find the root in terms of z when x,y are given.
> For example: f(x,y,z) =  x+y + (x^2-z),  given x=1,y=3, f(1,3,z)= 1+3+1-z is 
> a function of z, and then I can use R to find the root z=5.
> 
> Thank you.
> -Chee

Interesting exercise.

I've got this function, which I think it's doing what you're asking.

f <- function(x,y,z)
{
        fcall <- match.call()
        fargs <- NULL
        if(fcall$x == "x")
                fargs <- c(fargs, "x")
        if(fcall$y == "y")
                fargs <- c(fargs, "y")
        if(fcall$z == "z")
                fargs <- c(fargs, "z")
        
        ffunargs <- as.list(fargs)
        names(ffunargs) <- fargs
        
        argslist <- list(fcall)
        ffun <- append(argslist, substitute( x+y + (x^2-z) ), after=0)[[1]]
        as.function(append(ffunargs, ffun))
}

This yields.

> f(3, 2, z)
function (z = "z") 
3 + 2 + (3^2 - z)
<environment: 0x132fdb8>
> f(3, 2, z)(3)
[1] 11

I haven't figured out how to get rid of the default argument value shown
here as 'z = "z"'. That doesn't prevent it to work, but it's less
pretty.  If you find a better way, let me know.

HTH,
Jerome

______________________________________________
R-help@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.

Reply via email to