[R-pkg-devel] Writing a portable package that imports functions only available on Windows

Duncan Murdoch murdoch.duncan at gmail.com
Sat Sep 19 13:20:03 CEST 2015

On 19/09/2015 6:07 AM, Richard Cotton wrote:
> I have a package that uses win.version from the utils package.
> I've made my R code safe to use across platforms, I check that the OS is
> Windows before calling win.version.
> The NAMESPACE file contains the line
> importFrom(utils,win.version)
> which causes an install failure under other OSes since that function
> doesn't exist.
> Can I use this platform-dependent function and still have a cross-platform
> package?

I think there are two ways to do this.

You can use conditionals in the NAMESPACE file. For example, rgl has

if(tools:::.OStype() == "windows") {
importFrom(utils, getWindowsHandle)

This is really old code, and I'm surprised I don't get warnings about
the :::. I believe a better test would be

.Platform$OS.type == "windows"

but I just sent a new version of rgl to CRAN before noticing this, so
the fix will have to wait.

Alternatively, I believe if you use utils::win.version in the code
instead of importing it in the NAMESPACE file you won't get a warning.
(You need to condition the call on being on Windows, of course.)

> Also, it seems like it would be nicer if the utils package always included
> this function and returned NA with a warning on platforms other than
> Windows.  Does that sound like a reasonable change?

Platform-specific functions cause a number of problems; this is just one
of them.  It might be a good idea to do away with them completely, but
that would be pretty boring work, for little gain.

Duncan Murdoch

More information about the R-package-devel mailing list