Skip to content

R-2.8.0 : get platform device with get(getOption("device"))

9 messages · Frédéric Lafitte, Brian Ripley, Peter Dalgaard +1 more

#
Please do study the posting guide.  This was covered recently:

https://stat.ethz.ch/pipermail/r-devel/2008-April/049319.html
On Wed, 7 May 2008, Fr?d?ric Lafitte wrote:

            
There is no 'R 2.8.0' and will not be for some months.  You probably mean 
R-devel, but your code has been erroneous since R 2.5.0.

  
    
#
Fr?d?ric Lafitte wrote:
Use dev.new() instead of  that construct.
#
Prof Brian Ripley wrote:
Nevertheless, perhaps an explicit NEWS entry could be warranted, 
something like

   o    The "device" option can now be a function, and is one in some 
standard setups. Consequentially, get(getOption("device")) will fail; 
programmers should usually use dev.new() instead.

  
    
#
Here is the NEWS item, for 2.5.0

     o	options(device = ) now accepts a function object as well as
 	the name of a function.

The construct in the subject line has been broken ever since.
On Thu, 8 May 2008, Peter Dalgaard wrote:

            

  
    
#
Prof Brian Ripley wrote:
OK, but that entry was obviously hard to spot even when looking for it!
So...

o    The "device" option now is a function in some standard setups. 
Consequentially, get(getOption("device")) will fail; programmers should 
usually use dev.new() instead. (Assuming that the device is a character 
string has been incorrect since 2.5.0.)

  
    
#
On Thu, 8 May 2008, Peter Dalgaard wrote:

            
Yet the change produced no warnings when made, so apparently
everyone else missed it!
Prof Brian Ripley noted [in another recent message] that
it was also wrong to assume ANY arguments for dev.new
method. If we are only concerned with interactive screen
devices (i.e., x11, windows, quartz), would it be safe to
come up with a method that can take basic dimension arguments
(width & height)? Suggestions for an R-Core approved method
of doing so?

We use this functionality every day for creating multiple
onscreen windows with specified dimensions.

While I understand things have to change to evolve the
codebase, this change broke the code supporting countless
papers and analyses here in our department, without warning
until now.

----------------------------------------------------------
SIGSIG -- signature too long (core dumped)
#
If you set, say

options(device="pdf")

you get the old behaviour.  You really cannot assume that session settings 
will be unchanged unless you set them yourself.
On Fri, 9 May 2008, Paul Roebuck wrote:

            
It did, if you set that option.

  
    
21 days later
#
On Fri, 9 May 2008, Paul Roebuck wrote:

            
Prof. Ripley replied to original note but not to my main
concern. Are there problems with this alternate approach
to creating new interactive devices (R-2.8+)?
Comments/Suggestions appreciated.


##----------------------------------------------------------
## Create new interactive device. Arguments must be named.
intdev.new <- function(...) {
    dev <- getOption("device")
    if (is.character(dev)) {
        if (exists(dev, .GlobalEnv))
            dev <- get(dev, .GlobalEnv)
        else if (exists(dev, asNamespace("grDevices")))
            dev <- get(dev, asNamespace("grDevices"))
        else {
            stop(gettextf("device '%s' not found", dev),
                 domain = NA)
        }
    }

    if (!is.function(dev)) {
        stop("invalid setting for 'getOption(\"device\")'")
    } else if (!dev.interactive(TRUE)) {
        stop("device must be interactive")
    }

    arglist <- as.list(formals(dev))
    extras <- match.call(expand.dots=FALSE)$...
    if (length(extras) > 0) {
        matched <- !is.na(match(names(extras), names(arglist)))
        for (a in names(extras)[matched]) {
            arglist[[a]] <- extras[[a]]
            extras[[a]] <- NULL
        }
        if (length(extras) > 0) {
            stop(sprintf("unnamed argument(s) not allowed: %s",
                         paste(extras, collapse=", ")))
        }
        if (any(!matched)) {
            warning(sprintf("arguments ignored: %s",
                            paste(names(extras[!matched]),
                                  collapse=", ")))
        }
    }

    do.call(dev, arglist)
}

## Create interactive device using common arguments
R> intdev.new(width=5, height=5, title="Test")


TIA

----------------------------------------------------------
SIGSIG -- signature too long (core dumped)