Windows上有哪些解决方法可以让Sys.which找到合适的可执行文件?两个重新解决问题的案例:
convert.exe
这是一个Windows程序和ImageMagik程序,但是Sys.which只找到一个从来不想从R获得的窗口,无论我怎么在我的PATH上安排东西。< / p>
tar.exe
与各种东西一起打包,比如git或mingw等等,即使我的路径中有Rtools和Rbuildtools,也从未找到Rtools的tar
程序,例如,从源代码安装软件包时。
所以,每当我在Windows上时,我都会编写一个调用7-zip的包装器。这不是可以做的事情吗?
实际上只是将环境变量添加到.Renviron
:TAR=path/to/tar.exe
适用于install.packages
示例,我无法记住tar.exe
咬我的地方,但乔希回答了主要问题,convert.exe
。
答案 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()
这具有以下优点:
## 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()
sys_which(c("python", "python3"))
可确保任何导致系统调用出错的输入都传递给常规tryCatch(...)
函数。示例:
Sys.which()