upper snake nomenclatura kebab estandares camelcase camel r camelcasing

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