Ho un vettore di nomi (umani), il tutto in maiuscolo:Decapitalize nomi umani (che rappresentano il 'e -)
names <- c("FRIEDRICH SCHILLER", "FRANK O'HARA", "HANS-CHRISTIAN ANDERSEN")
Per decapitalize (capitalizzare le prime lettere solo) finora, ero utilizzando
simpleDecap <- function(x) {
s <- strsplit(x, " ")[[1]]
paste0(substring(s, 1,1), tolower(substring(s, 2)), collapse=" ")
}
sapply(names, simpleDecap, USE.NAMES=FALSE)
# [1] "Friedrich Schiller" "Frank O'hara" "Hans-christian Andersen"
ma voglio anche rendere conto per '
e -
. L'utilizzo di s <- strsplit(x, " |\\'|\\-")[[1]]
ovviamente trova le lettere giuste, ma poi nel collasso '
e -
si perdono. Quindi, ho cercato
simpleDecap2 <- function(x) {
for (char in c(" ", "\\-", "\\'")){
s <- strsplit(x, char)[[1]]
x <-paste0(substring(s, 1,1), tolower(substring(s, 2)), collapse=char)
} return x
}
sapply (nomi, simpleDecap, USE.NAMES = FALSE)
ma che è ancora peggio, naturalmente, in quanto i risultati sono divisi l'uno dopo l'altro:
sapply(names, simpleDecap2, USE.NAMES=FALSE)
# [1] "Friedrich schiller" "Frank o'Hara" "Hans-christian andersen"
Penso che l'approccio giusto divida in base allo s <- strsplit(x, " |\\'|\\-")[[1]]
, ma il problema è il paste=
.
amore la concisione * e * incomprensibilità di perl-regexp :-) –
@CarlWitthoft Non sono affatto d'accordo con questo. Come qualsiasi altra lingua, devono essere apprese, ma per quello che esprimono sono molto semplici e comprensibili. L'affermazione generale che le regex sono incomprensibili è un'enorme canard: equivalente, il codice di analisi manuale è quasi sempre più complesso e difficile da capire. Usare la parola "incomprensibile" per questo è davvero fuorviante. –
È uno scherzo divertente al meme che perl stesso permette uno stile di programmazione che rende il concorso c-code offuscato pallido al confronto. Ovviamente la regex è * la * via da seguire per la manipolazione delle stringhe. –