[R] printing a generated function crashes R

Peter Dalgaard p.dalgaard at biostat.ku.dk
Wed Sep 13 18:03:45 CEST 2006


Mstislav Elagin <elagin at 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
function inside:

> f <- bquote(function(x) {
+     x + 1
+ }
+ )
> f
function(x) {
    x + 1
}
> eval(f)
À
ÈH~

ÈH~

Program received signal SIGSEGV, Segmentation fault.


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

> z <- eval(f)
> attr(z,"source")
"function(x) {"("x+1}")
> z
ÈX~
ÈX~
..poof..

-- 
   O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)                  FAX: (+45) 35327907



More information about the R-help mailing list