R:给定环境中的唯一对象名称

R: Unique object name in given environment

我有一个函数可以return对象名称向量,它在给定环境中是唯一的:

find_unique_name <- function(nNames, environment) {

  un <- replicate(nNames, paste0(sample(LETTERS, 10), collapse=""))

  while (any(duplicated(un)) | any(un %in% ls(envir = environment))) {

    un <- replicate(nNames, paste0(sample(LETTERS, 10), collapse=""))
  }    

  return(un)
}

我想知道是否可以提高这个函数的速度,因为它在算法中被调用了很多次。我想知道它是否可以矢量化,或者至少是否有办法在没有循环的情况下进行矢量化。我怀疑这不是查找唯一对象名称向量的最快方法。谢谢!

要生成新名称,我建议使用以下而不是 replicate...

gen_names <- function(nNames) {
  vapply(1:nNames, 
         function(i) {
           paste0(sample(LETTERS, 10), collapse = "")
          }, 
         FUN.VALUE = character(1))
}

您知道您想要 characters 并且您应该将此信息用于优化原因。

在每次迭代中,您都会列出环境中的名称。这不需要每次迭代都完成,因为环境中的名称不会改变。并且知道有多少名称是有效的新名称,您不需要在每次迭代时创建 nNames,只需创建您需要的差异。 所以我建议

get_unique_name <- function(nNames, environment = .GlobalEnv) {
  
  namesInEnvironment <- ls(envir = environment)
  
  un <- gen_names(nNames)
  un <- unique(un)
  un <- un[!(un %in% namesInEnvironment)]
  
  while(length(un)<nNames) {
    needNamesNr <- nNames - lenth(un)
    un <- c(un,gen_names(needNamesNr))
    un <- unique(un)
    un <- un[!(un %in% namesInEnvironment)]
  }    
  
  return(un[1:nNames])
}

我做了一些基准测试,下面的名称生成函数要快得多:

gen_names2 <- function(nNames = 100) {
  apply(matrix(sample(LETTERS,nNames*10,replace = T),ncol = 10),
        1,
        paste0,collapse="")
}