How to define specially nested functions
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