【问题标题】:Installing a package offline from GitHub从 GitHub 离线安装包
【发布时间】:2016-01-15 17:15:03
【问题描述】:

我正在尝试将一些包移植到离线 (Windows) 计算机上的 R 安装。

从 CRAN(假设为 data.table),过程:1)在单独的在线计算机上下载 .zip 2)拇指驱动器 -> 离线计算机 3)通过 install.packages("....zip"...) 安装完全符合预期。

但是,当我尝试从 GitHub 安装时,此过程中断。

当我在 zip 文件上运行 install.packages(注意:我正在使用 type="binary"repos=NULLtype="win.binary" 也不执行任何操作)时(通过转到包页面获得,例如 https://github.com/Rdatatable/data.table,并且使用“下载.zip”功能),出了点问题。

没有错误消息(设置 verbose=TRUE 没有任何新信息),并且包文件夹被添加到我的库中(即,当我导航到那里时,我可以看到名为“data.table-master”的文件夹),但是library(data.table) 导致错误:“没有名为 data.table 的包”。我还注意到,虽然从 CRAN 的安装以“成功解压缩包 data.table 并检查 MD5 总和”结束,但尝试 GitHub 安装时没有收到此类消息。

这里发生了什么?我在?install.packages 中尝试了所有可能的线索,但鉴于我并没有真正收到错误消息,因此很难诊断出究竟是什么问题。

更多背景:R 版本是 3.2.0。难以复制粘贴sessionInfo,因为那台计算机不在线,不确定还有什么相关的。

更新:

鉴于下面的@r2evans 的 cmets,我还尝试将 type="source"install.packages 一起使用,但这也不起作用(同样的问题 - 尽管我的 @987654336 之一中有“data.table-master”文件夹@address,library(data.table) 给出没有这样的包的错误)。

不过,这次使用verbose=TRUE 确实获得了更多输出:

系统(cmd0):C:/PROGRA~1/R/R-32~1.0/bin/x64/R CMD INSTALL

1): 成功'C:/PROGRA~1/R/R-32~1.0/bin/x64/R CMD INSTALL -l "C:\Users\Mike\Documents\R\win-library\3.2" "E:/data.table-master.zip"'

【问题讨论】:

  • 从 GH 下载的包不是以“源”形式而不是“二进制”形式下载的吗?
  • @r2evans 我得试试看。鉴于 CRAN 和 GH 都生成 .zip 文件夹,我不能说我理解其中的区别。我最初的通行证是使用type="both",但是当repos="NULL" 时这是一个错误,所以我不会抓住这个。
  • R 通常在zip 文件中分发二进制包,在tar.gz 文件中分发源包,但这并不意味着在zip 文件中分发的所有内容都是二进制包。查看两种格式的另一个包(不是来自 GH),并在内部查看差异。
  • 从 github 下载 zip 只是一个压缩文件夹,其中包含 repo 中的文件。 install_github 从源代码下载并安装(这就是为什么您还必须安装开发工具才能使其工作)。也许令人困惑的是,当从 Windows(二进制)构建时,您还会得到一个 .zip 文件,可以用于安装包,因为这些文件已经通过 R CMD build/R CMD 检查,但那些不是您从 gethub 获取的相同 .zip 文件。这是问题的要点吗?
  • @MichaelChirico 适用于二进制 .zip 包。对于源 .tar.gz 或来自 github 的文件夹,您需要安装 r 工具或为特定平台构建 r 包所需的任何东西

标签: r


【解决方案1】:

假设您在 win 机器上安装了 Rtools 和 devtools。

第一步:Download the source zip.

第2步:复制到win机并解压其中的内容。

第 3 步:运行以下代码(根据需要调整路径):

library(devtools)
source <- devtools:::source_pkg("E:/temp/data.table-master")
install(source)

library(data.table)
#loads 1.9.7

【讨论】:

  • 我真傻,看来 RTools 是问题的根源。 source_pkg 有什么意义?我能够运行install.packages("F:\\path\\to\\package\\", repos = NULL, type = "source")。我问是因为devtools 有一系列依赖项,每个依赖项都很难在离线机器上安装......通过额外的圈套获得devtools 有什么好处吗?
  • 我提供了一个替代方案,因为您声称 install.packages 不适用于从源代码安装(我没有尝试过)。很好,你解决了这个问题。
【解决方案2】:

您可以使用 devtools 中的 install_local 来安装带有您下载的 zip 的 Github 包,例如:

library("devtools")
install_local(path = "data.table-master.zip")

但您必须先安装所有依赖项。

【讨论】:

    【解决方案3】:

    不确定这是解决方案还是解决方法。给定一个 R 包目录结构源的 zip 文件:

    在外壳上:

    ~$ unzip data.table-master.zip
    ## optional renaming
    ~$ mv data.table-master data.table
    ## create the new
    ~$ tar czf data.table.tar.gz data.table
    

    可能还有其他工具可以让您以不同的格式提取和重新归档它们。由于我倾向于 shell 级别的访问和控制,因此我倾向于使用这些简单的工具。

    在 R 中:

    install.packages("data.table.tar.gz", type="source", repos=NULL)
    

    (除非已安装所有依赖项,否则此操作不会成功。)

    【讨论】:

    • 为了清楚起见(因为我现在不在电脑前测试)你建议我从 Linux(或其他终端友好的机器)下载 zip,重新 tar从命令行,然后将此重新压缩的文件传输到离线计算机并安装为"source"?顺便说一句,感谢您迄今为止的帮助!
    • 这种方法对我来说失败了; “运行命令"C:/PROGRA~1/R/R-32~1.0/bin/x64/R" CMD INSTALL -l "C:\Users\Mike\Documents\R\win-library\3.2" "E:/data.table.tar.gz" 状态为 1”; this 我发现的问题似乎表明解决方案是将文件重新转换为 zip TT
    【解决方案4】:

    以下函数将位于 path 的 GitHub .zip 文件提取到临时目录并直接从那里安装包,即不创建临时 .tar.gz 存档。该函数尝试猜测包名,但也可以通过pkg 给出。临时文件在退出时被删除。

    此函数不安装任何依赖项。

    install_zip <- function(path,
                            pkg = sub("(-[^-]+)?\\.[^.]+$", "", basename(path))) {
        dir1 <- tempfile()
        dir2 <- file.path(dir1, pkg)
        dir.create(dir2, recursive = TRUE)
        on.exit(unlink(dir1, recursive = TRUE, force = TRUE))
        suppressMessages(unzip(path, exdir = dir2,
                               unzip = getOption("unzip")))
        temp_contents <- dir(dir2)
        if (length(temp_contents) == 1L) {
            dir3 <- file.path(dir2, temp_contents)
            if (file.info(dir3, extra_cols=FALSE)[["isdir"]]) {
                dir2 <- file.path(dir2, pkg)
                file.rename(dir3, dir2)
            }
        }
        install.packages(dir2, repos = NULL, type = "source")
    }
    

    【讨论】:

      【解决方案5】:

      所以我终于想出了一个在某些情况下有效的解决方法……但不可否认,它有点笨拙。希望听到一些关于如何使这种方法适用于任何包的反馈。

      由于我有一个包,其中所有代码都在一个 .R 文件中,因此我为该包伪造了一个包环境,并将函数源引入了该环境。假设包都在test.R:

      #add an appropriately named package to the search() path
      attach(environment(), name = "package:pkg")
      
      #source the functions
      sys.source("test.R", envir = as.environment("package:pkg"))
      

      瞧。我不太了解如何加载包来说明如何执行此操作,例如,如果包在 C 或其他内容中有 src 代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-15
        • 2012-06-20
        相关资源
        最近更新 更多