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

Paul Roebuck plroebuck at mdanderson.org
Fri May 30 22:33:00 CEST 2008


On Fri, 9 May 2008, Paul Roebuck wrote:

> On Thu, 8 May 2008, Peter Dalgaard wrote:
>
> > >> [SNIP Ripley conversation]
> >
> > 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.)
>
> 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.

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)



More information about the R-devel mailing list