From henrik.bengtsson at ucsf.edu  Mon May 18 22:40:09 2015
From: henrik.bengtsson at ucsf.edu (Henrik Bengtsson)
Date: Mon, 18 May 2015 13:40:09 -0700
Subject: [Rd] How best to get around shadowing of executables by
 system()'s prepending of directories to Windows' PATH?
In-Reply-To: <CANROs4fGuWFjE7a=CunKyC_rpcE40RRBLxzLeDf6TbCGMcQqGA@mail.gmail.com>
References: <CAOwKfPQXiGY9O_A-Bjv7LmOsB5ybVD86eKc-joLpm2abG1etxg@mail.gmail.com>
	<CANROs4fGuWFjE7a=CunKyC_rpcE40RRBLxzLeDf6TbCGMcQqGA@mail.gmail.com>
Message-ID: <CAFDcVCTNRcGU+yNrp=H0JAyeLsFz8yOZ7uMzz3GNbdfmqOonbQ@mail.gmail.com>

You probably already know, but you can at least work around it as:

Sys.which2 <- function(cmd) {
  stopifnot(length(cmd) == 1)
  if (.Platform$OS.type == "windows") {
    suppressWarnings({
      pathname <- shell(sprintf("where %s 2> NUL", cmd), intern=TRUE)[1]
   })
   if (!is.na(pathname)) return(setNames(pathname, cmd))
  }
  Sys.which(cmd)
}

(it falls back to Sys.which() if 'where %s' doesn't give anything)


> Sys.which2("convert")
                                                convert
"C:\\Program Files\\ImageMagick-6.8.3-Q16\\convert.exe"

> Sys.which("convert")
                             convert
"C:\\Windows\\system32\\convert.exe"

/Henrik

On Mon, May 18, 2015 at 11:08 AM, Yihui Xie <xie at yihui.name> wrote:
> +1 I have exactly the same problem.
>
> Regards,
> Yihui
> --
> Yihui Xie <xieyihui at gmail.com>
> Web: http://yihui.name
>
>
> On Mon, May 18, 2015 at 12:29 PM, 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
>> 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")
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



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