From: Mstislav Elagin <elagin_at_wias-berlin.de>

Date: Tue 19 Sep 2006 - 07:37:46 GMT

*>
*

> Well, bquote seems to be doing nasty things if passed an expression with a

*> function inside:
*

*>
*

*> + }
*

*> + )
*

*> }
*

*> À
*

*> ÈH~
*

*>
*

*> ÈH~
*

*>
*

> Program received signal SIGSEGV, Segmentation fault.

*>
*

*>
*

*> I think the story is that the source attribute is getting messed up.
*

*>
*

> "function(x) {"("x+1}")

*> ÈX~
*

*> ÈX~
*

> ..poof..

}

formals(fun) <- alist(x=, y=)

return(fun)

}

fun <- make.function()

fun(3, 2) ## -> 7

R-help@stat.math.ethz.ch 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. Received on Tue Sep 19 17:44:49 2006

Date: Tue 19 Sep 2006 - 07:37:46 GMT

Peter Dalgaard wrote:

> Mstislav Elagin <elagin@wias-berlin.de> writes:

*>
*

>> Dear All, >> >> the last expression in the following code snippet crashes R (version >> 2.3.1 on Windows XP) when run interactively: >> >> make.bad.function <- function(kind) >> { >> zz <- switch(kind, >> "1" = 1, >> "2" = 2) >> >> stopifnot( !is.null(zz) ) >> >> eval( bquote( function(x) >> { >> x + .(zz) >> })) >> } >> >> # bad.function <- make.bad.function("5") ## error as expected >> >> bad.function <- make.bad.function("1") >> print(bad.function(10)) ## -> 11 >> >> bad.function <- make.bad.function("2") >> print(bad.function(10)) ## -> 12 >> >> bad.function ## this works if the code is source()'d >> print(bad.function) ## oops! >> >> However, it does work (i.e. prints the body of bad.function) if run >> non-interactively >> (R --vanilla < bad-function.R). >> >> Any ideas why this happens?

> Well, bquote seems to be doing nasty things if passed an expression with a

>> f <- bquote(function(x) {

> + x + 1

>> f

> function(x) {

> x + 1

>> eval(f)

> Program received signal SIGSEGV, Segmentation fault.

>> z <- eval(f) >> attr(z,"source")

> "function(x) {"("x+1}")

>> z

> ..poof..

Hallo,

make.bad.function <- function()

{

zz <- 1

eval( bquote( function(x, y)

{ x*y + .(zz) }))

}

bad.fun <- make.bad.function()

> Error in eval(expr, envir, enclos) : invalid formal argument list for > "function"

make.function <- function()

{

zz <- 1

fun <-

eval( bquote( function() { x*y + .(zz) }))

formals(fun) <- alist(x=, y=)

return(fun)

}

fun <- make.function()

fun(3, 2) ## -> 7

Printing the function works, too:

fun

> function (x, y) > { > x * y + 1 > } > <environment: 01A5884C>

My earlier example with the function of one argument works fine when rewritten in the same spirit.

Have a nice day

Mstislav Elagin

R-help@stat.math.ethz.ch 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. Received on Tue Sep 19 17:44:49 2006

Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.

Archive generated by hypermail 2.1.8, at Tue 19 Sep 2006 - 13:30:07 GMT.

*
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help.
Please read the posting
guide before posting to the list.
*