解压缩错误(文件,exdir = tmp):'exdir'不存在(Windows 10 R安装)

时间:2018-06-22 12:49:25

标签: r

当我尝试从Windows 10 R安装运行程序包命令时,收到错误消息“ unzip(file,exdir = tmp)中的错误:'exdir'不存在”。

不幸的是,我没有能力将unzip作为单独的命令运行,因为软件包将其作为其编译命令之一运行。

  • 将tmp目录创建到C:\
  • 我将我的权限更改为对C:\ tmp文件夹的完全控制权限

在其他帖子中,许多人都可以通过删除路径末尾的“ /”来解决此错误。不幸的是,因为这是另一个软件包脚本,所以我无法直接控制执行解压缩时的路径。

1 个答案:

答案 0 :(得分:0)

我同意斜杠可以导致此问题。但是,如果您无法控制unzip的调用方式,那么我认为解决该问题的唯一“肯定”方法就是获得程序包作者的支持。

话虽如此,请尝试一下。它无法100%正常运行,但是在您可以使用适当的修复程序之前,它可能会让您远远不够。我们将使用更好地容纳尾部斜杠的函数覆盖unzip函数(在 this R会话中)。

首先,我们要做的就是添加前缀

exdir <- gsub("[\\/]$", "", exdir)
C_unzip <- utils:::C_unzip

到代码。第一行只是从exdir变量中删除尾随的斜杠(向后或向前)。第二行是名称空间搜索的解决方法。 (有必要,按 I Believe 按钮。)

在我的测试中,这足以用斜杠排除错误('exdir' does not exist)。那么我们如何覆盖函数内容呢?

  1. 调用fixInNamespace("unzip", "utils"),将上述几行作为函数的前两行代码插入(if (identical(unzip, "internal"))之前),然后保存。

  2. 编写您自己的函数版本并覆盖它。获取函数源(通过在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的方式而起作用。我认为问题是由于名称空间搜索引起的,但我(显然)对这一阶段的抢先了解不足。 (请社区提供帮助吗?)我已经在其他渠道中看到过这种要求/讨论的解决方案,通常会出现“有时有效,但是...” 的警告,所以也许这是我们的极限

但是,实际上,您最好的解决方法是与程序包作者/维护者联系。