我可以获取install.packages将使用的URL吗?

时间:2018-09-17 13:11:57

标签: r package cran

在Windows上运行install.packages("any_package")时,我收到消息:

  

尝试网址

     

'somepath.zip'

我想不下载而获得此路径,这可能吗?

换句话说,我想获得CRAN链接到最新版本的Windows二进制文件(最好的办法实际上是能够使用与install.packages相同的参数来调用新函数并获取适当的网址作为输出)。

我需要一种可以从R控制台运行的方式(无需手动检查CRAN页面等)。

2 个答案:

答案 0 :(得分:3)

我不确定这是否是您想要的。这将从存储库信息构建URL,并构建可用软件包列表的文件名。

#get repository name
repos<- getOption("repos")

#Get url for the binary package
#contrib.url(repos, "both")
contriburl<-contrib.url(repos, "binary")
#"https://mirrors.nics.utk.edu/cran/bin/windows/contrib/3.5"

#make data.frame of avaialbe packages
df<-as.data.frame(available.packages())

#find package of interest
pkg <- "tidyr"  #example
#ofinterest<-grep(pkg, df$Package)
ofinterest<-match(pkg, df$Package)   #returns a single value

#assemble name, assumes it is always a zip file
name<-paste0(df[ofinterest,]$Package, "_", df[ofinterest,]$Version, ".zip")

#make final URL 
finalurl<-paste0(contriburl, "/", name)

答案 1 :(得分:1)

以下是几个函数:

  • 从RStudio网站获取最新的R版本
  • 获取最新发布的Windows二进制文件的网址

第一个是我在installr软件包中找到的代码的变体。似乎没有干净的方法来获取最新版本,因此我们必须抓取一个网页。

第二个实际上只是对@ Dave2e的代码进行了优化,并将其重构为一个函数(带有针对过时的R版本的修复程序),因此请直接投票给他答案。

get_package_url <- function(pkg){
  version <- try(
    available.packages()[pkg,"Version"],
    silent = TRUE)
  if(inherits(version,"try-error"))
    stop("Package '",pkg,"' is not available")
  contriburl <- contrib.url(getOption("repos"), "binary")
  url <- file.path(
    dirname(contriburl),
    get_last_R_version(2),
    paste0(pkg,"_",version,".zip"))
  url
}

get_last_R_version <- function(n=3){
  page <- readLines(
    "https://cran.rstudio.com/bin/windows/base/",
    warn = FALSE)   
  line <- grep("R-[0-9.]+.+-win\\.exe",  page,value=TRUE)
  long <- gsub("^.*?R-([0-9.]+.+)-win\\.exe.*$","\\1",line)
  paste(strsplit(long,"\\.")[[1]][1:n], collapse=".")
}

get_package_url("data.table")
# on my system with R 3.3.1 
# [1] "https://lib.ugent.be/CRAN/bin/windows/contrib/3.5/data.table_1.11.4.zip"