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

R:避免安装加载的包与避免安装附加的包

  •  0
  • andrewH  · 技术社区  · 7 年前

    当我调试一个复杂的脚本时,我经常需要重复地获取脚本的源代码,以便rstudio断点处于活动状态。在此设置中,我不希望安装已加载(附加?)的包。,因为rstudio强烈建议在尝试安装已加载(附加?)的包时重新启动r。,并且我的一些代码正在大型(大约10-30gb)数据文件上测试,对于这些文件,将文件上载到r非常耗时。

    到目前为止,我从来没有必要区分加载的程序和附加的程序,因为我一直都是两者兼而有之。但我现在正在尝试编写一个函数,以避免安装已加载(附加?)的程序。,我试图理解避免只重新安装已加载的包、仅重新安装已附加的包、仅重新安装已加载和附加的包或仅重新安装已加载或附加的包的相关含义。

    下面的代码应该更新所有软件包,然后安装从(可能)新软件包矢量中获取的所有软件包,这些软件包要么已卸载,要么未附加,或者两者都未附加。但是,如果加载了一个包,但既没有附加也没有安装(如果可能的话),则不会安装它。在任何可能的情况下,这种限制会导致问题吗?

    install.packs <- function(pks, ...){
      update.packages(ask=FALSE)
      uninstalled <- pks[!(pks %in% installed.packages(...)[ , 1])] 
      unattached  <- pks[!(pks %in% (.packages(...)))]
      new_pks     <- unique(c(uninstalled, unattached))
      install.packages(unattached, repos = "https://cloud.r-project.org/", ...)
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   DJV    7 年前

    虽然它不能完全回答您的问题-您可以在开始调试之前运行一个脚本,脚本中使用了哪些包。此外,为了避免包中的版本冲突(例如,如果脚本使用 ggplot2_2.0.0 但你有 ggplot2_3.0.0 安装)您可以使用 checkpoint 包裹.

    例如:

    InstallNeededPackges <- function(path) {
    
      #Load/Install checkpoint pkg
      if (!require("checkpoint")) install.packages("checkpoint")
    
      #Getting the list of all pkgs in the script
      PkgsInScript <- checkpoint::scanForPackages(Path,
                                                  use.knitr = TRUE)
    
      #Finding missing pkgs
      list.of.packages <- PkgsInScript$pkgs
      new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()
                                         [,"Package"])]
    
      #Installing
      install.packages(new.packages)
    
    }