如何在Windows上使用Sys.which查找正确的可执行文件

时间:2015-12-01 21:03:24

标签: r windows

Windows上有哪些解决方法可以让Sys.which找到合适的可执行文件?两个重新解决问题的案例:

  1. convert.exe这是一个Windows程序和ImageMagik程序,但是Sys.which只找到一个从来不想从R获得的窗口,无论我怎么在我的PATH上安排东西。< / p>

  2. tar.exe与各种东西一起打包,比如git或mingw等等,即使我的路径中有Rtools和Rbuildtools,也从未找到Rtools的tar程序,例如,从源代码安装软件包时。

  3. 所以,每当我在Windows上时,我都会编写一个调用7-zip的包装器。这不是可以做的事情吗?

    修改

    实际上只是将环境变量添加到.RenvironTAR=path/to/tar.exe适用于install.packages示例,我无法记住tar.exe咬我的地方,但乔希回答了主要问题,convert.exe

2 个答案:

答案 0 :(得分:7)

我在今年早些时候提出了一个+/-相同的问题over on R-devel。 Henrik Bengtsson的回复是this one,他们提供了以下有用的功能:

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

## Trying out Sys.which & Sys.which2 on my Windows box gives the following:
Sys.which("convert")
#                              convert 
# "C:\\Windows\\system32\\convert.exe" 
Sys.which2("convert")
#                                                 convert 
# "C:\\Program Files\\ImageMagick-6.8.8-Q16\\convert.exe" 

我真的不确定为什么R-core不会修复Sys.which()以使其实际上是可移植的,但它们至少会在?system中记录此行为的根本原因(其功能受到同一问题的影响):

  

&#39;命令的搜索路径&#39;可能是系统依赖的:它会   包括R&#39; bin&#39;目录,工作目录和   在&#39;路径&#39;。

之前的Windows系统目录

答案 1 :(得分:1)

因为Sys.which()是矢量化的,并且由于我认为这很有用,所以我在以下函数sys_which()中修改了Henrik Bengtsson代码,该函数应该是{的更健壮和更相似的版本{1}}:

Sys.which()

这具有以下优点:

  1. 它是向量化的## check if unix is_unix <- function() grepl("unix", .Platform$OS.type, ignore.case = TRUE) ## robust version of Sys.which sys_which <- function(x) { if (is_unix()) { return(Sys.which(x)) } sys_win <- function(x) { if (grepl("\\S", path <- Sys.which(x))) { return(path) } path <- tryCatch( suppressWarnings(system(sprintf("where %s", x), intern = TRUE)[1]), warning = function(w) "", error = function(e) "") if (!grepl("\\S", path)) { return(`names<-`("", x)) } `names<-`(path, x) } vapply(x, sys_win, character(1)) } 可以处理一个向量(一个或多个输入值),例如sys_which()
  2. 它具有更高的抗错误性 –使用sys_which(c("python", "python3"))可确保任何导致系统调用出错的输入都传递给常规tryCatch(...)函数。

示例:

Sys.which()