当我尝试从Windows 10 R安装运行程序包命令时,收到错误消息“ unzip(file,exdir = tmp)中的错误:'exdir'不存在”。
不幸的是,我没有能力将unzip作为单独的命令运行,因为软件包将其作为其编译命令之一运行。
在其他帖子中,许多人都可以通过删除路径末尾的“ /”来解决此错误。不幸的是,因为这是另一个软件包脚本,所以我无法直接控制执行解压缩时的路径。
答案 0 :(得分:0)
我同意斜杠可以导致此问题。但是,如果您无法控制unzip
的调用方式,那么我认为解决该问题的唯一“肯定”方法就是获得程序包作者的支持。
话虽如此,请尝试一下。它无法100%正常运行,但是在您可以使用适当的修复程序之前,它可能会让您远远不够。我们将使用更好地容纳尾部斜杠的函数覆盖unzip
函数(在 this R会话中)。
首先,我们要做的就是添加前缀
exdir <- gsub("[\\/]$", "", exdir)
C_unzip <- utils:::C_unzip
到代码。第一行只是从exdir
变量中删除尾随的斜杠(向后或向前)。第二行是名称空间搜索的解决方法。 (有必要,按 I Believe 按钮。)
在我的测试中,这足以用斜杠排除错误('exdir' does not exist
)。那么我们如何覆盖函数内容呢?
调用fixInNamespace("unzip", "utils")
,将上述几行作为函数的前两行代码插入(if (identical(unzip, "internal"))
之前),然后保存。
编写您自己的函数版本并覆盖它。获取函数源(通过在R控制台上输入unzip
并将其分配给自己的函数,例如说unzip2
:
unzip2 <- function (zipfile, files = NULL, list = FALSE, overwrite = TRUE,
junkpaths = FALSE, exdir = ".", unzip = "internal", setTimes = FALSE) {
exdir <- gsub("[\\/]$", "", exdir) # <-- new line 1 of 2
C_unzip <- utils:::C_unzip # <-- new line 2 of 2
if (identical(unzip, "internal")) {
if (!list && !missing(exdir))
dir.create(exdir, showWarnings = FALSE, recursive = TRUE)
res <- .External(C_unzip, zipfile, files, exdir, list,
overwrite, junkpaths, setTimes)
...
(我省略了大部分功能,部分是为了简洁起见,部分是因为此方法不适用于胆小的人。如果您不愿意自己获取函数的来源,也许您应该不要尝试这种方法。)
然后我们需要将其移至适当的名称空间:
assignInNamespace("unzip", unzip2, "utils")
此修复程序:
unzip("somefile.zip", exdir="path/to/dir") # succeeds, as before
unzip("somefile.zip", exdir="path/to/dir/") # fails despite patch
utils::unzip("somefile.zip", exdir="path/to/dir/") # succeeds, because of patch
因此,这是一个不完善的补丁程序,可能取决于包函数调用unzip
的方式而起作用。我认为问题是由于名称空间搜索引起的,但我(显然)对这一阶段的抢先了解不足。 (请社区提供帮助吗?)我已经在其他渠道中看到过这种要求/讨论的解决方案,通常会出现“有时有效,但是...” 的警告,所以也许这是我们的极限
但是,实际上,您最好的解决方法是与程序包作者/维护者联系。