R version: 3.5.3, 3.6.3

更新日期: 2020-9-10

大家测试后多提建议哈, 有问题我会持续更新的

在工作中,我们使用的服务器通常是不能联外网的,这在安装R包的时候产生了巨大的不便。网上有很多帖子使用tools::package_dependencies这个工具下载依赖,但是这个工具是有坑的,相信尝试过的同学依然会发现有些依赖包在下载时被漏掉了,查了很多帖子,这个问题一直没有很好的解决。

今天,我就来解决这个问题,一来,方便自己,二来,服务他人。

我们就用R自己来解决自己的问题吧!

在本地有网络的环境中下载需要的R包:

library(rvest)
library(stringi)
library(stringr) dir <- 'c:/work/R/packages/' # 设置一个空目录存放R包
pknames <- c('Seurat') # 这是想要安装的包名称,可以设定多个包哦

第一个函数,用于生成repo的下载地址:

get_addr <- function(name,repo='https://cloud.r-project.org/'){
addr <- paste0(repo,'web/packages/',name,'/index.html')
return(addr)
}

第二个函数,获得一个包的次级依赖:

get_dep <- function(name){
addr <- get_addr(name)
gettry <- try(page <- read_html(addr),silent = T)
if('try-error' %in% class(gettry)){
return('-')
}
gettry <- try(pkg_table <- page %>% html_node("table") %>% html_table(fill = TRUE),silent = T)
if('try-error' %in% class(gettry)){
return('-')
}
dep_pkgs1 <- c()
dep_pkgs2 <- c()
if(length(which(pkg_table[,1]=='Imports:'))>0 ){
tmp <- str_replace_all(pkg_table[which(pkg_table[,1]=='Imports:'),2],'\\(.*?\\)','')
tmp <- str_split(tmp,'\\,')[[1]]
tmp <- str_replace_all(tmp,'\\(.*\n.*\\)','')
dep_pkgs1 <- trimws(tmp, which = c("both", "left", "right"))
# return(dep_pkgs)
}
if( length(which(pkg_table[,1]=='LinkingTo:'))>0 ){
tmp <- str_replace_all(pkg_table[which(pkg_table[,1]=='LinkingTo:'),2],'\\(.*?\\)','')
tmp <- str_split(tmp,'\\,')[[1]]
tmp <- str_replace_all(tmp,'\\(.*\n.*\\)','')
dep_pkgs2 <- trimws(tmp, which = c("both", "left", "right"))
}
if( length(dep_pkgs1)>0 & length(dep_pkgs2)>0 ){
return( c(dep_pkgs1,dep_pkgs2) )
}else if(length(dep_pkgs1)>0 & length(dep_pkgs2)==0){
return( dep_pkgs1 )
}else if(length(dep_pkgs1)==0 & length(dep_pkgs2)>0){
return( dep_pkgs2 )
}else{
return('-')
}
}

第三个函数,获得需要安装的所有包的全部依赖:

get_all_dep <- function(pknames){
all_list <- c()
all_list <- c(all_list,pknames)
top <- 1
for (i in 1:length(all_list)) {
one <- get_dep(all_list[i])
if(all(one != '-')){
all_list <- c(all_list,one)
}
top <- top + 1
} while(top <= length(all_list)){
cat('finding dep of',all_list[top],'...\n')
cat( 'length=',length(all_list),'\n' )
cat( 'top=',top,'\n' ) if( all_list[top] %in% all_list[(top+1):length(all_list)] ){
top <- top + 1
next
}else{
one <- get_dep(all_list[top])
if(length(one) == 1 && one == '-'){
top <- top + 1
next
}else{
all_list <- c(all_list,one)
top <- top + 1
}
}
} res_list <- c()
for (i in length(all_list):1) {
if( ! all_list[i] %in% res_list ){
res_list <- c(all_list[i],res_list)
}
} return(res_list)
}

好了,现在在联网的环境下调用这个函数:

res <- get_all_dep(pknames) # 不要管报错,没啥问题

现在下载res中的记录的包,路径就是dir

download.packages(res,destdir = dir)
split_list <- str_split(list.files(dir),'_')
download_pkgs1 <- unlist(split_list)[seq(1,length(split_list)*2,2)]
download_pkgs2 <- unlist(split_list)[seq(2,length(split_list)*2,2)]
res <- cbind(res,NA)
for (i in 1:length(res[,1])) {
if( res[i,1] %in% download_pkgs1 ){
name <- download_pkgs1[which(download_pkgs1 == res[i,1])]
version <- download_pkgs2[which(download_pkgs1 == res[i,1])]
res[i,2] <- paste0(name,'_',version )
}
}
save(res,file= paste0(dir,'install_list.RData') )

本地的工作结束了,现在将dir目录打包上传到服务器,用服务器上的R运行以下代码,将服务器对应的目录设置为wdir

wdir <- '/home/you/packages/'
load(file = paste0(wdir,'install_list.RData'))
installed_packages <- row.names(installed.packages())
for (i in length(res[,1]):1) {
if( res[i,1] %in% installed_packages | is.na(res[i,2]) ){
next
}else{
install.packages(pkgs=paste0(wdir,res[i,2]),repos = NULL,type = 'source')
}
# a = readline('continue?')
# if(a != ''){
# break
# }
# 这里可以注释掉,我要装131个包,一个个敲回车太累了,可以先运行一遍,再去掉注释运行一遍,以防某些依赖库缺失的情况
}

不出意外的话,所有的包就装好了,反正我的好了哈哈,以后就用这个啦。

R语言无网络安装R包,彻底解决依赖问题!的更多相关文章

  1. centos7离线安装rpm包自动解决依赖

    离线安装rpm包自动解决依赖参照https://blog.csdn.net/u011396718/article/details/80153515当生产环境由于安全原因处于断网状态的时候.通过本地源的 ...

  2. 离线安装rpm包并解决依赖(升级vsftpd为例)

    背景  实际开发中,我们的linux服务器是处理离线状态的,并不能访问互联网.如果此时要在linux上安装或者升级软件,就只能通过rpm包的安装方式.rpm包安装有一个缺陷,就是不能处理安装包的依赖问 ...

  3. R语言·文本挖掘︱Rwordseg/rJava两包的安装(安到吐血)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言·文本挖掘︱Rwordseg/rJava ...

  4. R语言—如何安装Github包的解决方法,亲测有效

    R语言—如何安装Github包的解决方法,亲测有效 准备安装材料: R包-REmap GitHub下载地址:https://github.com/lchiffon/REmap R包-baidumap ...

  5. R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:与前面的RsowballC分词不同的 ...

  6. R语言中动态安装库

    R语言中动态安装库 在一个R脚本中,我们使用了某些library,但是发现运行环境中没有这个library,如果能检测一下有没有这个包,没有就自动安装该多好.而R中非常方便地支持这些,只要联网. 代码 ...

  7. R语言入门级实例——用igragh包分析社群

    R语言入门级实例——用igragh包分析社群 引入—— 本文的主要目的是初步实现R的igraph包的基础功能,包括绘制关系网络图(social relationship).利用算法进行社群发现(com ...

  8. R语言数据分析利器data.table包—数据框结构处理精讲

    R语言数据分析利器data.table包-数据框结构处理精讲 R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代 ...

  9. R语言- 实验报告 - 利用R语言脚本与Java相互调用

    一. 实训内容 利用R语言对Java项目程序进行调用,本实验包括利用R语言对java的.java文件进行编译和执行输出. 在Java中调用R语言程序.本实验通过eclipse编写Java程序的方式,调 ...

随机推荐

  1. leetcode128-generate-parentheses

    题目描述 给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合. 例如,给出n=3,解集为: "((()))", "(()())", "( ...

  2. python实现年会抽奖程序

    用python来实现一个抽奖程序,供大家参考,具体内容如下 主要功能有 1.从一个csv文件中读入所有员工工号2.将这些工号初始到一个列表中3.用random模块下的choice函数来随机选择列表中的 ...

  3. 对ESP8266的例子进行编译时报错check_python_dependencies的问题的解决

    尝试对ESP8266的例子进行编译时报错: make: *** 没有规则可制作目标"check_python_dependencies" 解决方法: 1.安装python pip包 ...

  4. c++函数声明的位置对函数重载的影响

    c++为了兼容c,也是采用(假)单遍编译.这特别影响函数重载决议(当c++编译器读到一个函数调用语句时,它必须从目前已看到的同名函数中选出最佳函数,哪怕后面的代码中出现了更合适的匹配) 1 #incl ...

  5. 【java从入门到精通】day08-java流程控制-用户交互Scanner--顺序结构--选择结构

    1.java流程控制 Scanner对象: Java提供了一个工具类,可以获取用户的输入 java.until.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入 基本语 ...

  6. mds的cpu占用问题分析以及解决办法

    前言 mds是ceph里面处理文件接口的组件,一旦使用文件系统,不可避免的会出现一种场景就是目录很多,目录里面的文件很多,而mds是一个单进程的组件,现在虽然有了muti mds,但稳定的使用的大部分 ...

  7. appium 数据参数化 登录模块

    下面是我最近学习的PYTHON的登录代码: class test(object): def getdic(self): d = {'username': '13', 'password': '1111 ...

  8. HECTF-5bit编码(Baudot Code)

    河北师大全国赛道比赛,第一次遇到这样的题,刚开始发现应该是一道摩斯密码的题,空格给去掉了,我在网上搜了半天, 列举全部的可能结果的工具,结果结果,啥也不是,感觉还是自己的能力不行吧,不过wp出来,感觉 ...

  9. PHP中的变量覆盖漏洞

    简介 今天利用周六整理了一下 php覆盖的漏洞 榆林学院的同学可以使用协会内部实验平台进行实验操作. 1.extract()变量覆盖 1.extract() extract() 函数从数组中将变量导入 ...

  10. 思维导图软件iMindMap制作技巧有哪些

    iMindMap11是iMindMap全新的版本.它可以提供给我们更好的灵活性以便我们将我们的思维进行可视化,并进一步的呈现和开发出属于自己的想法以及思维方式.在iMindMap中我们可以利用思维导图 ...