我一直致力于一个包含大量子部件的大型研究项目。我已经为每个子部分创建了一个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")
答案 0 :(得分:5)
有许多缺点。按严重程度粗略排列:
这使代码更难理解。代码很复杂。因此,健壮的代码尽可能简单。这是软件工程中已经确立的事实,也是常识。其中一个重要的部分是限制在程序中任何给定点可见的符号数:如果在状态X处有1000个符号可见,这意味着,为了证明状态X的事情(=知道什么是继续在X),我需要推理多达1000个符号及其相互作用。这显然是不可能的。所以bug就会蔓延开来。
相关地,加载和附加许多包会导致名称冲突,因为不同的包将使用相同的名称。这本身并不是问题,只是语言如何运作的自然结果:好的标识符有时适用于不同的域。不幸的是,R在处理来自不同包的相同标识符方面非常糟糕。最好不要让情况出现。
为什么我需要再次使用包X?我可以保证您在项目的某个时刻,您将加载不再在代码中的任何位置使用的包。
加载包可能会很慢。仅这一点应该是仅加载所需包的原因。我不知道您正在使用的所有软件包,但有些软件包(特别是在Bioconductor中)可能需要10秒才能加载。
一般来说,我强烈反对不必要地加载软件包的做法。出于同样的原因,我也不是