加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

确定所有包依赖项的最小R版本

发布时间:2020-12-14 04:55:56 所属栏目:百科 来源:网络整理
导读:我是一个软件包开发人员,想要说明在DESCRIPTION文件中使用我的软件包所需的最低R版本. available.packages解析包的描述,但结果不是(容易)机器可读的查找递归依赖,因为Imports和Depends字段是逗号分隔文本,有时包含包有版本要求. 解决方案描述于: Listing R
我是一个软件包开发人员,想要说明在DESCRIPTION文件中使用我的软件包所需的最低R版本.

available.packages解析包的描述,但结果不是(容易)机器可读的查找递归依赖,因为Imports和Depends字段是逗号分隔文本,有时包含包有版本要求.

解决方案描述于:
Listing R Package Dependencies Without Installing Packages不是递归解决方案.如果嵌套依赖性需要R> 3.3,我想了解它.

至少,我希望看到给定CRAN包的R和导入,链接和依赖包的最低版本.更好的是列出设置最小R或包版本的包或包.

通过消除具有更高版本要求的依赖关系,我可以为更多人提供他们无法解决的系统旧R版本:一些仍然在R 2.x.

解决方法

min_r_version <- function(package="ggplot2",exclude_main_pkg=TRUE) {

  purrr::walk(c("tools","purrr","devtools","stringi","tidyr","dplyr"),require,character.only=TRUE)

  deps <- package_dependencies(package,recursive=TRUE)

  if (exclude_main_pkg) {
    pkgs <- deps[[1]]
  } else {
    pkgs <- c(package,deps[[1]])
  }

  available.packages() %>% 
    as_data_frame() %>% 
    filter(Package %in% pkgs) %>% 
    select(Depends)  %>% 
    unlist() -> pkg_list

  # if main pkg only relied on core R packages (i.e. pkgs that aren't in CRAN) and we 
  # excluded the pkg itself from the min version calculation,this is an edge case we need
  # to handle.

  if (length(pkg_list) == 0) return("Unspecified")

  stri_split_regex(pkg_list,"[,]") %>%
    unlist() %>%
    trimws() %>%
    stri_match_all_regex(c("^R$|^R (.*)$")) %>%
    unlist() %>%
    discard(is.na(.)) %>%
    unique() %>%
    stri_replace_all_regex("[R >=()]","") %>%
    data_frame(vs=.) %>%
    separate(vs,c("a","b","c"),fill="right") %>%
    mutate(c=ifelse(is.na(c),c)) %>%
    arrange(a,b,c) %>%
    tail(1) %>%
    unite(min,a:c,sep=".") -> vs

  return(vs$min)

}

# did we handle the edge cases well enought?
base <- c("base","compiler","datasets","grDevices","graphics","grid","methods","parallel","profile","splines","stats","stats4","tcltk","tools","translations")
(base_reqs <- purrr::map_chr(base,min_r_version))
##  [1] "Unspecified" "Unspecified" "Unspecified" "Unspecified" "Unspecified"
##  [6] "Unspecified" "Unspecified" "Unspecified" "Unspecified" "Unspecified"
## [11] "Unspecified" "Unspecified" "Unspecified" "Unspecified" "Unspecified"

# a few of the "core" contributed pkgs rely on a pkg or two outside of base
# but many only rely on base packages,to this is another gd edge case to
# text for.
contrib <- c("KernSmooth","MASS","Matrix","boot","class","cluster","codetools","foreign","lattice","mgcv","nlme","nnet","rpart","spatial","survival")
contrib_reqs <- purrr::map_chr(contrib,min_r_version)
##  [1] "Unspecified" "Unspecified" "3.0.0"       "Unspecified" "3.1.0"      
##  [6] "Unspecified" "Unspecified" "Unspecified" "Unspecified" "3.0.2"      
## [11] "3.0.0"       "Unspecified" "Unspecified" "Unspecified" "3.0.1"      

# See what the min version of R shld be for some of my pkgs
min_r_version("ggalt") # I claim R (>= 3.0.0) in DESCRIPTION
## [1] "3.1.2"

min_r_version("curlconverter") # I claim R (>= 3.0.0) in DESCRIPTION
## [1] "3.1.2"

min_r_version("iptools") # I claim R (>= 3.0.0) in DESCRIPTION
## [1] "3.0.0"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读