[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