如何直接从Github编译R包二进制文件?

问题描述:

devtools包提供了从Github通过install_github命令安装包的可能性。如何直接从Github编译R包二进制文件?

使用build命令在devtools包可以从本地文件夹编译A R包二进制文件。

是否也可以使用build从Github文件夹直接编译(不安装)R软件包二进制文件,即类似build("https://github.com/user/rpackage")

+0

没有检查它是否是可能的,但有在下载包并在本地构建它的任何缺点? – nicola

+0

在R内通过单个命令执行它将会更加方便。 – majom

有趣的问题。我不知道为此目的而构建的功能,但这并不意味着这是不可能的。我写此基础上我学到了什么从devtools包学习一些非导出函数,具体的功能,

# devtools:::git_remote 
# devtools:::remote 
# devtools:::install_remotes 
# devtools:::try_install_remote 
# devtools:::install_remote 
# devtools:::install 
# devtools:::R 
# devtools:::remote_download.git_remote 

功能build_from_git会要求你有devtools和安装git2r。这个函数将获取一个在git服务器上托管的R包的url,创建一个临时目录,克隆该repo,构建包,将.tar.gz移动到工作目录,然后删除临时文件。

请注意,我经常在本作品中使用:::,这通常不建议使用,如Writing R Extensions手册中所述。但是,当您需要/想要使用其他包中的非导出函数时,这是一种合理的编程方法。参数与devtools::install_git相同。

build_from_git <- function(url, subdir = NULL, branch = NULL, credentials = NULL, progress = interactive()) { 
    grmt <- devtools:::git_remote(url, subdir = subdir, branch = branch, credentials = NULL) 

    bundle <- "__temp__" 
    git2r::clone(grmt$url, bundle, credentials = grmt$credentials, progress = progress) 

    if (!is.null(grmt$branch)) { 
    r <- git2r::repository(bundle) 
    git2r::checkout(r, grmt$branch) 
    } 
    on.exit(unlink(bundle, recursive = TRUE), add = TRUE) 

    sourcepkg <- devtools::as.package(devtools:::source_pkg(bundle, subdir = grmt$subdir)) 
    on.exit(unlink(sourcepkg, recursive = TRUE), add = TRUE) 

    devtools:::R("CMD build . ", path = "__temp__") 
    system("mv __temp__/*.tar.gz .") 
} 

使用例:

build_from_git(url = "https://github.com/dewittpe/qwraps2.git", progress = interactive()) 

您应该看到.tar.gz文件在工作目录。

上面所做的工作会议的信息是:

> sessionInfo() 
R version 3.4.1 (2017-06-30) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Debian GNU/Linux 9 (stretch) 

Matrix products: default 
BLAS: /usr/lib/openblas-base/libblas.so.3 
LAPACK: /usr/lib/libopenblasp-r0.2.19.so 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
[7] LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] compiler_3.4.1 withr_1.0.2  memoise_1.1.0 git2r_0.19.0 
[5] digest_0.6.12 devtools_1.13.2