Hi,

Is it what you are looking for?

> ff  <- function(a,b,c){a+b+c}

> ff(1,10,12)
[1] 23

> ff(589,2,4)
[1] 595

HTH,
Pascal


Le 04/02/2013 19:00, Søren Højsgaard a écrit :
Dear list

# I have a function
  ff  <- function(a,b=2,c=4){a+b+c}
# which I programmatically want to modify to a more specialized function in 
which a is replaced by 1
  ff1 <- function(b=2,c=4){1+b+c}

# I do as follows:
  vals  <- list(a=1)
  (expr1 <- as.expression(body(ff)))
expression({
     a + b + c
})
  (expr2 <- do.call("substitute", list(expr1[[1]], vals)))
{
     1 + b + c
}

  # This "works",
  eval(expr2, list(b=10,c=12))
[1] 23

  # - but I would like a function. Hence I do:
  ll  <- alist(b=, c=, eval(expr2))
  ff2 <- as.function(ll)
  ff2(b=10,c=12)
[1] 23

  # BUT I am only half-way where I want to be because the alist(b=, c=, ...)
  # requires me plugin the remaining formals by hand. I do:
  newformals <-setdiff(names(formals(ff)), names(vals))
  vv         <- vector("list", length(newformals))
  names(vv)  <- newformals
  (hh <- c(vv, expr2))
$b
NULL
$c
NULL
[[3]]
{
     1 + b + c
}

  (ff3 <- as.function(hh))
function (b = NULL, c = NULL)
{
     1 + b + c
}
  ff3(10,12)
[1] 23
  # Hence I get the function that returns what I want (given the correct input)
  # but the arguments will have default values that I don't want.
  # I want to retain the original default values (if any)
  ff1()
[1] 7
  ff3()
numeric(0)

I have two questions:
1) How to fix the above?
2) Aren't there more elegant alternatives?

Any help would be appreciated.
Regards
Søren


______________________________________________
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.


______________________________________________
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