如果我调用一个函数来加载一个已经加载的包,我会占用两倍的内存吗?

If I call a function which loads an already loaded package, do I occupy twice as much memory?

假设我有

library(purrr)

big_data <- replicate(10, data.frame(rep(NA, 1e6), sample(c(1:8, NA), 1e6, T), 
                                     sample(250, 1e6, T)), simplify = F)
bd <- do.call(data.frame, big_data)
names(bd) <- paste0('X', seq_len(30))

source("find_missing_columns.r")

index <- find_missing_columns(bd) 

其中find_missing_columns.r的内容是

find_missing_columns <- function(dataframe){
  # find columns which are all NA in dataframe: returns a logical vector index
  library(purrr)

  all_na <- function(x) {all(is.na(x))}
  index <-  map_lgl(dataframe, ~ all(is.na(.)))

}

purrr 在主函数和函数中被加载了两次。这是否意味着,在 运行 函数的同时,为同一个包分配了两倍的内存?如果是这种情况,那么不应将包加载到我在多个程序中重用的函数中。换句话说,我应该在find_missing_columns.r中评论library(purr)。但是,这引入了一个危险的依赖关系:只有在 purrr 已被调用者加载时,被调用函数才会起作用。那么,我是否应该始终在可调用函数中使用 purrr::map_lgl 语法,以便 both 避免不必要的内存占用 and 不引入依赖项关于调用代码?

A library() 调用将包添加到您的搜索路径,该路径特定于会话而不是特定于范围。您不能在函数中私下加载包。您不能多次加载同一个包。如果您使用相同的包名称再次调用 library(),则不会发生任何事情。

通常将 library() 放在函数调用中不是好的形式。使用完全限定名称更好。或者,如果您需要测试库是否存在,您可以使用 require()。通常人们只会在代码的顶部使用一次 library()

如果您有一堆从某个地方获取的函数,您可能需要考虑将它们制作成一个包,这样您就可以更明确地依赖其他包。