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="")
}
我有一个函数可以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="")
}