如何在离线 Debian 机器上安装 R 包?
Posted
技术标签:
【中文标题】如何在离线 Debian 机器上安装 R 包?【英文标题】:How can I install a R package on a offline Debian machine? 【发布时间】:2016-08-23 19:50:11 【问题描述】:我有一个未连接到互联网的 Debian 虚拟机。然而,我仍然可以从我的本地机器上 scp 任何有互联网连接的文件。为了提供一点上下文,我试图在 VM 上托管一个闪亮的应用程序。
我仍然可以使用“apt-get”命令安装旧版本的 R 3.1.1:
sudo apt-get update
sudo apt-get install r-base
sudo apt-get install r-base-dev
但是,查看列表时仍然找不到“闪亮”的包:
sudo apt-cache search "^r-.*" | sort
所以,我正在考虑是否可以将“shiny.tar.gz”scp 到 VM 并在本地安装包?如何离线安装任何 R 包?
我尝试过类似的方法:
install.packages('/home/mli/R/dir_pkg/shiny/shiny_0.13.2.tar.gz', repos = NULL, type = "source")
然而,它没有通过,错误信息如下:
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
Error in type == "both" :
comparison (1) is possible only for atomic and list types
Calls: install.packages
Execution halted
然后,我用另一个“R CMD”试了一下:
R CMD INSTALL /home/mli/R/dir_pkg/shiny/shiny_0.13.2.tar.gz
我收到错误消息,告诉我缺少依赖项:
* installing to library ‘/home/mli/R/x86_64-pc-linux-gnu-library/3.1’
ERROR: dependencies ‘httpuv’, ‘mime’, ‘jsonlite’, ‘xtable’, ‘digest’, ‘htmltools’, ‘R6’ are not available for package ‘shiny’
* removing ‘/home/mli/R/x86_64-pc-linux-gnu-library/3.1/shiny’
如何从源代码成功安装闪亮的包?我应该先安装所有依赖项和依赖项的依赖项吗?
【问题讨论】:
“R CMD INSTALL”命令不会自动查找和安装依赖,当依赖不满足时会拒绝安装包。可能有一种更简单的方法,但我只是在依赖项出现时检查它们(httpuv 是你被告知的更多),然后 R CMD 一个一个地安装它们。它们很容易找到,只需根据您在浏览器中下载闪亮包的链接导航到 r 项目页面(只需删除最后的闪亮部分),然后搜索您正在寻找的包。找到所需的所有依赖项通常需要 3 分钟左右。 【参考方案1】:Shiny 有一些软件包依赖项,“R CMD INSTALL”不会为您找到它们,因此您需要手动获取它们。根据shiny的描述,它的依赖是: “Rcpp”、“httpuv”、“mime”、“jsonlite”、“xtable”、“digest”、“htmltools”、“R6”。 所以首先,从 cran 获取软件包(以下是当前版本,但它们会随着时间的推移而变化。注意以下是连接到互联网的计算机,您需要在继续之前将它们 scp 到离线计算机):
wget https://cran.r-project.org/src/contrib/Rcpp_0.12.4.tar.gz
wget https://cran.r-project.org/src/contrib/httpuv_1.3.3.tar.gz
wget https://cran.r-project.org/src/contrib/mime_0.4.tar.gz
wget https://cran.r-project.org/src/contrib/jsonlite_0.9.19.tar.gz
wget https://cran.r-project.org/src/contrib/digest_0.6.9.tar.gz
wget https://cran.r-project.org/src/contrib/htmltools_0.3.5.tar.gz
wget https://cran.r-project.org/src/contrib/R6_2.1.2.tar.gz
wget https://cran.r-project.org/src/contrib/shiny_0.13.2.tar.gz
然后使用 R CMD INSTALL 以相同的顺序浏览它们。例如:
R CMD INSTALL Rcpp_0.12.4.tar.gz
一旦所有依赖项都存在,R CMD INSTALL 应该让您安装闪亮。
【讨论】:
完美运行!谢谢@rosscova!另外,感谢您为我列出所有“wget”!:)【参考方案2】:要在 Debian 上离线安装一些软件包,您可以使用 apt-offline :
apt-offline 可以在不连接网络的情况下完全更新和升级基于 APT 的发行版,所有这些对 APT 都是透明的。
apt-offline 可用于在机器(无网络)上生成签名。此签名包含 APT 数据库系统所需的所有下载信息。此签名文件可用于连接到 Internet 的另一台机器(不必是 Debian 机器,甚至可以运行 Windows)来下载更新。下载的数据将包含 APT 可以理解的格式的所有更新,并且该数据可以被 apt-offline 用于更新未联网的机器。
在离线操作系统(Debian)上安装apt-offline
,然后输入以下命令(导入丢失的密钥):
sudo apt-key exportall | sudo gpg --no-default-keyring --import --keyring /etc/apt/trusted.gpg
那你需要得到your_package_name
的签名:
apt-offline set debian-install.sig --install-packages your_package_name
下一步,将debian-install.sig
上传到在线系统并下载所需文件。
apt-offline get debian-install.sig --bundle debian-install.zip
将 debian-install.zip 文件上传到离线系统,使用 apt-offline 工具安装它以更新 APT 数据库。
sudo apt-offline install debian-install.zip
安装指定的包your_package_name
:
sudo apt-get install your_package_name
你可以使用windows机器下载你的包tuto
【讨论】:
谢谢@GAD3R!我以前从未使用过“apt-offline”,但探索它会很棒。然而,此时手动安装依赖项可能更直接。不过感谢您的回答!apt-offline
可以安装程序及其所有依赖项
我明白了。那么,我需要 scp “debian-install.sig” 到我的在线系统以生成“debian-install.zip”,然后将此 zip 文件上传回离线系统以完成安装?它适用于任何 R 包? apt-offline 可以找出所有需要的依赖项并构建到 zip 文件中?【参考方案3】:
你陷入困境。 R 包机制期望您连接以获取依赖项。也就是说,您可以获得一些帮助:
R> AP <- available.packages(contrib.url(options("repos")$repos[1]))
R> revs <- tools::package_dependencies("shiny", AP, recursive=TRUE)[[1]]
R> revs
[1] "methods" "utils" "httpuv" "mime"
[5] "jsonlite" "xtable" "digest" "htmltools"
[9] "R6" "Rcpp" "tools" "stats"
R>
您现在可以再次查看AP
并将其输入download.packages()
。
另外,其中几个(全部?)在 较新的 Debian 发行版中,因此您可以在下载模式下使用 apt-get
(可能按照其他问题中的建议使用 apt-offline
)。
最后,我们确实提供了Docker container for shiny,所以如果你在你的虚拟机上使用它,你就不需要其他任何东西了。
【讨论】:
【参考方案4】:sudo apt-get 更新
sudo apt-get install r-cran-digest
我无法相信这会如此简单。我花了很长时间搜索,得到的只是不好的答案。这个命令只是解决一切。 我在trisquel上用过
【讨论】:
以上是关于如何在离线 Debian 机器上安装 R 包?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在离线机器上更新 Visual Studio 2013 中的 nuget?