Я видел умный код, представленный Габором Г. в ответ на этот вопрос о устранении неоднозначности строк.Его ответ, слегка модифицированный, таков:
uniqName <- function(x){
thenames <- ave(x,x,FUN = function(z){
znam <- if (length(z) == 1) z else sprintf("%s%02d", z, seq_along(z))
return(znam)
})
return(thenames)
}
Я хотел пойти на «невидимую» версию этого и попытался придумать компактную функцию, которая добавляла бы N пробелов к (N + 1).) вхождение имени.(Код Габора вычисляет целое число и добавляет его, поэтому число добавляемых символов является постоянным).Лучшее, что я мог сделать, это следующая неуклюжая функция ("fatit")
spacify <- function (x){
fatit <-function(x){
k = vector(length=length(x))
for(jp in 1:length(x)){
k[jp]=sprintf('%s%s',x[jp],paste0(rep(' ',jp),collapse=''))
}
return(k)
}
spaceOut <- ave(x,x, FUN = function(z) if (length(z) == 1) z else fatit(z) )
return(spaceOut)
}
Есть ли какой-нибудь более чистый, более компактный способ установить количество добавляемых символов на основе length(z)
в fatit
функция?
Примечание:
uniqName(foo)
[1] "a01" "b01" "c01" "a02" "b02" "a03" "c02" "d" "e"
spacify(foo)
[1] "a " "b " "c " "a " "b " "a " "c " "d" "e"