r - snake - kebab case
Cómo convertir not.camel.case a CamelCase en R (5)
Alternativamente una solución basada en expresiones regulares:
t1 <- c(''this.text'', ''next.text'')
# capitalize first letter
t2 <- sub(''^(//w?)'', ''//U//1'', t1, perl=T)
# remove points and capitalize following letter
gsub(''//.(//w?)'', ''//U//1'', t2, perl=T)
[1] "ThisText" "NextText"
Edición: algunas explicaciones.
sub(''^(//w?)'', ''//U//1'', t1, perl=T)
, sub
es suficiente aquí porque solo estamos interesados en la primera coincidencia. Luego, el primer carácter alfanumérico se compara al comienzo de cada cadena con ^(//w?)
. Los paréntesis son necesarios para una referencia posterior en la parte de reemplazo de la función. Para el reemplazo, //U
se usa para capitalizar todo lo que viene después (que es el primer carácter).
El mismo principio se aplica en gsub(''//.(//w?)'', ''//U//1'', t2, perl=T)
con la única diferencia de que no se hace coincidir el primer carácter, sino todos .
.
En R, quiero convertir
t1 <- c(''this.text'', ''next.text'')
"this.text" "next.text"
a
''ThisText'' ''NextText''
Yo he tratado
gsub(''//..'', '''', t1)
Pero esto me da
"thisext" "nextext"
ya que no sustituye a la letra después del período.
Probablemente muy fácil pero no puedo resolverlo.
Aquí hay un enfoque pero con regex probablemente hay mejores:
t1 <- c(''this.text'', ''next.text'')
camel <- function(x){ #function for camel case
capit <- function(x) paste0(toupper(substring(x, 1, 1)), substring(x, 2, nchar(x)))
sapply(strsplit(x, "//."), function(x) paste(capit(x), collapse=""))
}
camel(t1)
Esto produce:
> camel(t1)
[1] "ThisText" "NextText"
EDITAR: Como curiosidad, marcé las 4 respuestas (TOM = póster original, TR = yo mismo, JMS = jmsigner y SB = sebastion; comenté en la publicación de jmsigner) y encontré que las respuestas no regex eran más rápidas. Los habría asumido más despacio.
expr min lq median uq max
1 JMS() 183.801 188.000 197.796 201.762 349.409
2 SB() 93.767 97.965 101.697 104.963 147.881
3 TOM() 75.107 82.105 85.370 89.102 1539.917
4 TR() 70.442 76.507 79.772 83.037 139.484
Aquí otra solución a través del paquete snakecase:
install.packages("snakecase")
library(snakecase)
to_upper_camel_case(t1)
#> [1] "ThisText" "NextText"
Githublink: https://github.com/Tazinho/snakecase
En realidad, creo que acabo de resolver esto desde el archivo de ayuda para toupper:
camel <- function(x) {
s <- strsplit(x, "//.")[[1]]
paste(toupper(substring(s, 1,1)), substring(s, 2),
sep="", collapse="")
}
camel(t1)
sapply(t1,camel)
this.text next.text
"ThisText" "NextText"
tocamel
from rapportools
package hace lo que quieres:
> library(rapportools)
> example(tocamel)
tocaml> tocamel("foo.bar")
tocaml> ## [1] "fooBar"
tocaml>
tocaml> tocamel("foo.bar", upper = TRUE)
tocaml> ## [1] "FooBar"
tocaml>
tocaml> tocamel(c("foobar", "foo.bar", "camel_case", "a.b.c.d"))
tocaml> ## [1] "foobar" "fooBar" "camelCase" "aBCD"
tocaml>
Actualizado:
Otra solución simple y rápida (como @rengis):
camel2 <- function(x) {
gsub("(^|[^[:alnum:]])([[:alnum:]])", "//U//2", x, perl = TRUE)
}
camel2(t1)
#> [1] "ThisText" "NextText"
Comparación con la solución @TylerRinker:
identical(camel(t1), camel2(t1))
#> [1] TRUE
microbenchmark::microbenchmark(camel(t1), camel2(t1))
#> Unit: microseconds
#> expr min lq mean median uq max neval cld
#> camel(t1) 76.378 79.6520 82.21509 81.5065 82.7095 151.867 100 b
#> camel2(t1) 15.864 16.9425 19.76000 20.9690 21.9735 38.246 100 a