在R中加载太多库的缺点是什么?

时间:2017-07-11 09:21:07

标签: r

我一直致力于一个包含大量子部件的大型研究项目。我已经为每个子部分创建了一个R脚本,所以我不会因为一个单独的脚本而丢失。

我的问题是关于在像这样的大型项目中加载库的最佳做法是什么?

以下是我的工作:我没有在每个子部分的开头调用特定的库,而是创建了一个单独的脚本来加载整个项目所需的所有库,我调用了这个脚本在每个子部分的开头。

有时我会在项目的子部分工作,例如,ggplot2和其他一些库。在R加载许多库的不足之处是你不一定会使用那个时刻?

以下是我的LoadPackages.R脚本的一小部分示例。请注意,此脚本旨在用于与其他用户共享的项目中,因此我发现确保正确安装所有库非常重要:

# List of packages to install
  list.of.packages <- c("sp", "rgeos", "ggplot2", "data.table", "rgdal", "dplyr", 
                        "magrittr", "spatialEco", "geosphere", "readr")

# Only install packages not installed yet
  new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
  if(length(new.packages)) install.packages(new.packages)

# Load packages
  library(sp)
  library(rgeos)
  library(ggplot2)
  library(data.table)
  library(dplyr)
  library(magrittr)
  library(readr)
  library(spatialEco)
  library(geosphere)
  library(rgdal)

# clean global env.
  rm(new.packages, list.of.packages)
  gc(reset = T)

在每个工作会话开始时,我通过运行:

加载所有库
source("./R scripts/LoadPackages.R")

1 个答案:

答案 0 :(得分:5)

有许多缺点。按严重程度粗略排列:

  1. 这使代码更难理解。代码很复杂。因此,健壮的代码尽可能简单。这是软件工程中已经确立的事实,也是常识。其中一个重要的部分是限制在程序中任何给定点可见的符号数:如果在状态X处有1000个符号可见,这意味着,为了证明状态X的事情(=知道什么是继续在X),我需要推理多达1000个符号及其相互作用。这显然是不可能的。所以bug就会蔓延开来。

  2. 相关地,加载和附加许多包会导致名称冲突,因为不同的包使用相同的名称。这本身并不是问题,只是语言如何运作的自然结果:好的标识符有时适用于不同的域。不幸的是,R在处理来自不同包的相同标识符方面非常糟糕。最好不要让情况出现。

  3. 为什么我需要再次使用包X?我可以保证您在项目的某个时刻,您将加载不再在代码中的任何位置使用的包。

  4. 加载包可能会很慢。仅这一点应该是仅加载所需包的原因。我不知道您正在使用的所有软件包,但有些软件包(特别是在Bioconductor中)可能需要10秒才能加载。

  5. 一般来说,我强烈反对不必要地加载软件包的做法。出于同样的原因,我也不是软件包的粉丝:交互式浏览可以一次性加载所有整齐的软件包,但它会降低可维护性,并且几乎在任何其他编程社区都违背既定的做法。