Re: [Rd] turning expression object to function

2006-12-19 Thread Antonio, Fabio Di Narzo
Tnx all for the interesting (and all working) suggestions!

Best regards,
Antonio.

2006/12/19, Gabor Grothendieck <[EMAIL PROTECTED]>:
> Here is one possibility.  It does not use the second argument in your function
> call but instead assumes the arguments of the output function are
> those variables
> in the expression that have not been assigned in the list L in the
> order encountered.
>
> library(gsubfn)
> asFun <- function(e, L = NULL, env = parent.frame()) {
>   fo <- ~ x
>   fo[[2]] <- e[[1]]
>   fun <- fn$force(as.formula(do.call(substitute, list(fo, L
>   environment(fun) <- env
>   fun
> }
>
> asFun(expression(a+b+c), list(b = 1, c = 2)) # function (a) a + 1 + 2
>
>
>
>
> On 12/18/06, Antonio, Fabio Di Narzo <[EMAIL PROTECTED]> wrote:
> > Dear all,
> > I have the following problem.
> >
> > Given an expression object 'expr' containing a certain set of symbols
> > (say 'a', 'b', 'c'), I would like to translate the expression object
> > in an R function of, say, 'a', programmatically. Here an example of
> > what I mean.
> >
> > Given:
> > > expr <- expression(a+b+c)
> >
> > a call like:
> > > asFunctionOf(expr, 'a', list(b=1, c=2))
> >
> > should return a function (not necessarly formally) equivalent to
> > > function(a) a+1+2
> >
> > Some suggestions?
> >
> > Best regards,
> > Antonio.
> >
> > __
> > R-devel@r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
>

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] turning expression object to function

2006-12-18 Thread Tony Plate
This is what I tried, and it seemed to work, but maybe others can give 
better ideas, and also explain why the first attempt to assign the 
formal arguments didn't work (but the second did.)

 > f <- function() NULL
 > formals(f) <- list(b=1, c=2)
 > f
function (b = 1)
2
 > formals(f) <- list(b=1, c=2)
 > f
function (b = 1, c = 2)
2
 > body(f)
[1] 2
 > body(f) <- expression(a+b+c)
 > f
function (b = 1, c = 2)
a + b + c
 > a <- 3
 > f()
[1] 6
 >

One thing you may want to be careful of is the environment of the function.

(If I don't start out with f having a NULL body, the first attempt to 
assign the formals works.)

-- Tony Plate

 > sessionInfo()
R version 2.4.0 (2006-10-03)
i386-pc-mingw32

locale:
LC_COLLATE=English_United States.1252;LC_CTYPE=English_United 
States.1252;LC_MONETARY=English_United 
States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252

attached base packages:
[1] "methods"   "stats" "graphics"  "grDevices" "utils" "datasets"
[7] "base"

other attached packages:
 MASS  foreign
"7.2-29" "0.8-17"
 >

Antonio, Fabio Di Narzo wrote:
> Dear all,
> I have the following problem.
> 
> Given an expression object 'expr' containing a certain set of symbols
> (say 'a', 'b', 'c'), I would like to translate the expression object
> in an R function of, say, 'a', programmatically. Here an example of
> what I mean.
> 
> Given:
> 
>>expr <- expression(a+b+c)
> 
> 
> a call like:
> 
>>asFunctionOf(expr, 'a', list(b=1, c=2))
> 
> 
> should return a function (not necessarly formally) equivalent to
> 
>>function(a) a+1+2
> 
> 
> Some suggestions?
> 
> Best regards,
> Antonio.
> 
> __
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] turning expression object to function

2006-12-18 Thread Gabor Grothendieck
Here is one possibility.  It does not use the second argument in your function
call but instead assumes the arguments of the output function are
those variables
in the expression that have not been assigned in the list L in the
order encountered.

library(gsubfn)
asFun <- function(e, L = NULL, env = parent.frame()) {
  fo <- ~ x
  fo[[2]] <- e[[1]]
  fun <- fn$force(as.formula(do.call(substitute, list(fo, L
  environment(fun) <- env
  fun
}

asFun(expression(a+b+c), list(b = 1, c = 2)) # function (a) a + 1 + 2




On 12/18/06, Antonio, Fabio Di Narzo <[EMAIL PROTECTED]> wrote:
> Dear all,
> I have the following problem.
>
> Given an expression object 'expr' containing a certain set of symbols
> (say 'a', 'b', 'c'), I would like to translate the expression object
> in an R function of, say, 'a', programmatically. Here an example of
> what I mean.
>
> Given:
> > expr <- expression(a+b+c)
>
> a call like:
> > asFunctionOf(expr, 'a', list(b=1, c=2))
>
> should return a function (not necessarly formally) equivalent to
> > function(a) a+1+2
>
> Some suggestions?
>
> Best regards,
> Antonio.
>
> __
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] turning expression object to function

2006-12-18 Thread Marc Schwartz
On Mon, 2006-12-18 at 19:06 +0100, Antonio, Fabio Di Narzo wrote:
> Dear all,
> I have the following problem.
> 
> Given an expression object 'expr' containing a certain set of symbols
> (say 'a', 'b', 'c'), I would like to translate the expression object
> in an R function of, say, 'a', programmatically. Here an example of
> what I mean.
> 
> Given:
> > expr <- expression(a+b+c)
> 
> a call like:
> > asFunctionOf(expr, 'a', list(b=1, c=2))
> 
> should return a function (not necessarly formally) equivalent to
> > function(a) a+1+2
> 
> Some suggestions?
> 
> Best regards,
> Antonio.

Let me offer some pointers and a couple of possible examples:

?call
?as.function
?alist
?eval
?parse


expr <- expression(a + b + c)

> as.function(alist(a = , b = 1, c = 2, eval(expr)))(5)
[1] 8

> as.function(alist(a = , b = 1, c = 2, eval(expr)))(5, 10, 8)
[1] 23



MyExpr <- paste(letters[1:3], collapse = " + ")

> MyExpr
[1] "a + b + c"

> as.function(alist(a = , b = 1, c = 2, eval(parse(text = MyExpr(6)
[1] 9


HTH,

Marc Schwartz

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


[Rd] turning expression object to function

2006-12-18 Thread Antonio, Fabio Di Narzo
Dear all,
I have the following problem.

Given an expression object 'expr' containing a certain set of symbols
(say 'a', 'b', 'c'), I would like to translate the expression object
in an R function of, say, 'a', programmatically. Here an example of
what I mean.

Given:
> expr <- expression(a+b+c)

a call like:
> asFunctionOf(expr, 'a', list(b=1, c=2))

should return a function (not necessarly formally) equivalent to
> function(a) a+1+2

Some suggestions?

Best regards,
Antonio.

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel