[Rd] How best to get around shadowing of executables by system()'s prepending of directories to Windows' PATH?
Josh O'Brien
joshmobrien at gmail.com
Mon May 18 19:29:49 CEST 2015
My question:
On Windows, R's system() command prepends several directories to those
in the Windows Path variable.
>From ?system
The search path for 'command' may be system-dependent: it will
include the R 'bin' directory, the working directory and the
Windows system directories before 'PATH'.
This shadows any executables on the Path that share a name with, for
example, one of the Windows commands.
What should I do when I'd really like (the equivalent of) a call
passed to system() that would be executed using the same Path that
you'd get if working directly at the Windows command line? Is there a
recommended workaround for situtations like this? (It _seems_ like it
would be handy if system() et al. included an additional argument that
optionally disabled the prepending of those extra directories, to give
Windows users full control of the path seen by system(). Would adding
such an argument have undesirable ramifications?)
Motivation and reproducible example:
I'm motivated here by a desire to use the function plotdiff() from
Paul Murrell's gridGraphics package on my Windows laptop. Getting
that to work will require a few code fixes, of which the masking of
ImageMagick's convert.exe by that in the C:/Windows/System32 seems to
be the most challenging. plotdiff() relies on system2() calls to
ImageMagick's 'convert' function, as well as a call to
Sys.which(c("convert", "compare")) that tests for the presence of
ImageMagick on the Path. Even if ImageMagick is placed early on the
Path, though, both calls to Sys.which() and system2() find Windows'
convert command (which "Converts FAT volumes to NTFS") rather than
ImageMagick's convert.
Here's a reproducible example that shows what I'm seeing:
## In R, make a pdf
pdf("a.pdf")
plot(rnorm(99), col="red")
dev.off()
## At Windows cmd command line
where convert
## C:\Program Files\ImageMagick-6.8.8-Q16\convert.exe
## C:\Windows\System32\convert.exe
convert -density 100x100 a.pdf a.png
## From R
## Unqualified references to convert find the 'wrong' one
Sys.which("convert")
## convert
## "C:\\Windows\\system32\\convert.exe"
system2("convert", "-density 100x100 a.pdf b.png")
## Invalid Parameter - 100x100
## Warning message:
## running command '"convert" -density 100x100 a.pdf b.png' had status 4
## A fully qualified reference does work
system2("C:/Program Files/ImageMagick-6.8.8-Q16/convert",
"-density 100x100 a.pdf b.png")
More information about the R-devel
mailing list