我正在尝试将某些软件包移植到离线(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"'
答案 0 :(得分:17)
假设你在胜利机器上有Rtools和devtools。
第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
代码或其他内容。