从GitHub

时间:2015-10-16 20:36:28

标签: r

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

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

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

当我在zip文件上运行install.packages(注意:我正在使用type="binary"repos=NULL; type="win.binary"什么都不做)(通过转到包裹获得)页面,例如https://github.com/Rdatatable/data.table,并使用“下载.zip”功能),出了点问题。

没有错误消息(并且设置verbose=TRUE没有任何新内容),并且包文件夹已添加到我的库中(即,当我在那里导航时,我可以看到名为“data.table-master”的文件夹) ,但library(data.table)会导致错误:“没有名为data.table的包”。我还注意到,虽然CRAN的安装完成了“package data.table成功解包并检查了MD5总和”,但我从GitHub安装尝试中得不到这样的消息。

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

更多背景:R版本是3.2.0。很难复制粘贴sessionInfo,因为该计算机不在线,不确定其他可能相关的内容。

更新

鉴于@ r2evans的评论如下,我也尝试将type="source"install.packages一起使用,这也不起作用(同样的问题 - 尽管在一个“data.table-master”文件夹中在我的.libPaths()地址中,library(data.table)给出的错误是没有这样的包。)

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

  

system(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"'

5 个答案:

答案 0 :(得分:17)

假设你在胜利机器上有Rtools和devtools。

第1步: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

答案 1 :(得分:6)

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

在shell上:

~$ 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)

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:3)

以下函数将位于.zip的GitHub path文件提取到临时目录,并直接从那里安装包,即不创建临时.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")
}

答案 4 :(得分:2)

所以我终于想出了一个在某些情况下有效的解决方法......但是它确实有点疯狂。很想听听关于如何使这种方法适用于任何包的一些反馈。

由于我有一个所有代码都在一个.R文件中的软件包,因此我欺骗了该软件包的软件包环境,并将这些函数提供给该环境。假设包全部在<div class="form-group"> <label class="col-md-3 control-label">Client</label> <div class="col-md-9"> <select name="clientId" id="clientId" class="form-control" placeholder="Select Client"> @foreach ($clients as $client) <option value='$client->cn_id'>{{$client->cv_name}}</option>; @endforeach </select> </div> </div> <div class="form-group"> <label class="col-md-3 control-label">Invoice Method</label> <div class="col-md-9"> <select type="hidden" name="invoiceId" id="invoiceId" class="form-control"> @foreach ($invoices as $invoice) <option value='$invoice->cn_id'>{{$invoice->cv_method}}</option>; @endforeach </select> </div> </div>

public function createOrEdit(){
    $currentUsername = Auth::user()->name;

    $isUpdate = false;
    $projectId = Input::get('prevId');

    //populate data
    $project = new Project;
    if($projectId != ""){
        $project = Project::where('cv_id','=',$projectId)->firstOrFail();
        $project->cv_updated_by = $currentUsername;
        $project->cn_updated_at = Carbon::now();
        $isUpdate = true;
    } else{
        $project->cv_created_by = $currentUsername;
        $project->cn_created_at = Carbon::now();
    }

    $project->cv_id = Input::get('projectId');
    $project->cv_name = Input::get('projectName');
    $project->cv_client_id = Input::get('clientId');
    $project->cn_invoice_method = Input::get('invoiceId');
    $project->cn_project_rate = Input::get('projectRate');
    $project->cn_note = Input::get('note');

    //execute
    if($isUpdate){
        Log::info("entering update mode");
        Project::where('cv_id','=',$projectId)->update(['cv_id'=>$project->cv_id,
                    'cv_name'=>$project->cv_name,
                    'cv_client_id'=>$project->cv_client_id,
                    'cn_invoice_method'=>$project->cn_invoice_method,
                    'cn_project_rate'=>$project->cn_project_rate,
                    'cn_note'=>$project->cn_note,
                    'cn_updated_at'=>$project->cn_updated_at,
                    'cv_updated_by'=>$project->cv_updated_by]);
    }else{
        $project->save();
    }

    return Response::json(
            array(
                    'content' => Project::with('client','invoice')->get(),
                    'status' => 'success',
                )
        );
}

瞧。我不太了解如何加载包以说明如何执行此操作,例如,如果包中包含{C}中的test.R代码或其他内容。