From joshmobrien at gmail.com  Tue May 19 19:32:57 2015
From: joshmobrien at gmail.com (Josh O'Brien)
Date: Tue, 19 May 2015 10:32:57 -0700
Subject: [Rd] How best to get around shadowing of executables by
 system()'s prepending of directories to Windows' PATH?
In-Reply-To: <CAOwKfPQXiGY9O_A-Bjv7LmOsB5ybVD86eKc-joLpm2abG1etxg@mail.gmail.com>
References: <CAOwKfPQXiGY9O_A-Bjv7LmOsB5ybVD86eKc-joLpm2abG1etxg@mail.gmail.com>
Message-ID: <CAOwKfPTCXgDBCvqiThwZSF26PXSaAs18WZmiHgJ_N50zipQ7vA@mail.gmail.com>

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")



[Rd] How best to get around shadowing of executables by system()'s prepending of directories to Windows' PATH?
Josh O'Brien