Prof Brian Ripley
2008-Apr-26 07:17 UTC
[Rd] Misuse of get(getOption("device"))() in packages
Quite a few packages have used this construct to launch a device, but it has several flaws. It's not clear in most cases that a package really needs to launch a new device (R will do so if needed), but 2.7.0 provides a function dev.new() to do so. (If you really need this in a GPL-ed package that must run in R < 2.7.0, consider copying dev.new.) You cannot assume any arguments for the default device, and lines like get(getOption("device"))(width=8,height=8) may throw an error or give you an 8x8 pixel device. Even worse is get(getOption("device"))(8, 8) as for e.g. X11() and quartz() the first argument is not a dimension, and get(getOption("device"))(width=3.55,height=3.55,rescale="fixed") applies to just one device (and this user at least does not want to get his magnifying glass out to examine plots forced into 6% of his screen area). It is better to adapt your plots to the user's environment than to attempt to adapt his/her environment to your plots. (dev.size(), also new in 2.7.0, may help you do so.) The more important flaws are: 1) As from R 2.5.0, options("device") can be a character string or a function. If the latter, this construct does not work. 2) ?options carefully describes the search path for the device if specified by name. get() in a package will not do the same thing, and is more likely to pick up another object of the same name. 3) What most of these packages do is to open another device when one is already open. If there is no screen device, this can be disastrous as e.g. there may already be a pdf() device open that is writing to Rplots.pdf, and get(getOption("device))() will start another pdf() device writing to Rplots.pdf: the result is almost certainly a corrupt PDF file. The intention is that in R 2.8.0 the out-of-the-box default devices will all be functions, so point 1 will apply. (dev.new will be more sophisticated there.) Many of the packages concerned are now showing ERROR in the 'r-devel Linux x86_64' section of http://cran.r-project.org/web/checks/check_summary.html -- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595