[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
Tue May 19 19:32:57 CEST 2015
On Mon, May 18, 2015 at 10:29 AM, Josh O'Brien <joshmobrien at gmail.com> wrote:
> 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
It appears that "use shell() instead of system()" is a reasonable, if
narrow, answer to this question.
Doing:
shell("convert -density 100x100 a.pdf b.png")
constructs (and then uses system() to call) the following command:
"C:\\Windows\\system32\\cmd.exe /c convert -density 100x100 a.pdf b.png"
which gives you just what you'd get if typing directly at the command line.
> 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