代码之家  ›  专栏  ›  技术社区  ›  moodymudskipper

我能得到你要用的东西的网址吗安装.程序包?

  •  2
  • moodymudskipper  · 技术社区  · 8 年前

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

    正在尝试URL

    我想得到这个路径而不下载,有可能吗?

    换言之,我想获得到最新版本的windows二进制文件的CRAN链接(最好的方法实际上是能够使用与之相同的参数调用一个新函数) install.packages 并获取适当的url作为输出)。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Dave2e    8 年前

    我不确定这是不是你要找的。这将从存储库信息构建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)
    
        2
  •  1
  •   moodymudskipper    8 年前

    下面是几个函数,分别是:

    • 获取上次发布的windows二进制文件的url

    第一个是我在 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"
    
    推荐文章