From jari.oksanen at oulu.fi  Fri Feb  8 10:45:27 2008
From: jari.oksanen at oulu.fi (jari.oksanen at oulu.fi)
Date: Fri,  8 Feb 2008 10:45:27 +0100 (CET)
Subject: [Rd] xspline(...,
	draw=FALSE) fails if there is no open device (PR#10727)
Message-ID: <20080208094527.ED730283460D@mail.pubhealth.ku.dk>

Full_Name: Jari Oksanen
Version:  2.6.2 RC (2008-02-07 r44369)
OS: Linux
Submission from: (NULL) (130.231.102.145)


Even if function xspline() is called with argument draw=FALSE, it requires a
graphics device (that it won't use since it was draw=FALSE). I run into this
because I intended to use xspline within a function (that does not yet draw:
there is plot method for that), and the function failed when called in a virgin
environment. 

Here is an example in a virgin environemt just after starting R:

> out <- xspline(c(0,1,0), c(1,0,1), draw=FALSE)
Error in xspline(c(0, 1, 0), c(1, 0, 1), draw = FALSE) : 
  plot.new has not been called yet
> str(out)
Error in str(out) : object "out" not found

This works:

> plot(0)
> out <- xspline(c(0,1,0), c(1,0,1), draw=FALSE)
> str(out)
List of 2
 $ x: num [1:3] 0 1 0
 $ y: num [1:3] 1 0 1

This won't:

> dev.off()
null device 
          1 
> xspline(c(0,1,0), c(1,0,1), draw=FALSE)
Error in xspline(c(0, 1, 0), c(1, 0, 1), draw = FALSE) : 
  plot.new has not been called yet

R graphics internal are black magic to me. However, it seems that the error
messge comes from function GCheckState(DevDesc *dd) in graphics.c, which is
called by do_xspline(SEXP call, SEXP op, SEXP args, SEXP env) in plot.c even
when xspline was called with draw = FALSE (and even before getting the argument
draw into do_xspline). It seems that graphics device is needed somewhere even
with draw = FALSE, since moving the  GCheckState() test after findig the value
draw, and executing the test only if draw=TRUE gave NaN as the numeric output. 

If this is documented behaviour, the documentation escaped my attention and beg
for pardon. It may be useful to add a comment on the help page saying that an
open graphics device is needed even when unused with draw=FALSE.

Cheers, Jari Oksanen

 platform = i686-pc-linux-gnu
 arch = i686
 os = linux-gnu
 system = i686, linux-gnu
 status = RC
 major = 2
 minor = 6.2
 year = 2008
 month = 02
 day = 07
 svn rev = 44369
 language = R
 version.string = R version 2.6.2 RC (2008-02-07 r44369)

Locale:
LC_CTYPE=en_GB.UTF-8;LC_NUMERIC=C;LC_TIME=en_GB.UTF-8;LC_COLLATE=en_GB.UTF-8;LC_MONETARY=en_GB.UTF-8;LC_MESSAGES=en_GB.UTF-8;LC_PAPER=en_GB.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_GB.UTF-8;LC_IDENTIFICATION=C

Search Path:
 .GlobalEnv, package:stats, package:graphics, package:grDevices, package:utils,
package:datasets, package:methods, Autoloads, package:base



[Rd] xspline(..., draw=FALSE) fails if there is no open device (PR#10727)
jari.oksanen at oulu.fi