r

Diferencia entre char y objetos de personaje



(2)

De la definición del lenguaje :

"char": un objeto de cadena ''escalar'' (solo interno) ***
"personaje": un vector que contiene valores de caracteres

Los usuarios no pueden obtener fácilmente objetos de tipos marcados con un ''***''.

y <- "My name is hasnain" class(y)

Las funciones de clase dicen que ''y'' pertenece a la clase de caracteres. Lo que he percibido es que ''y'' es un objeto de tipo char y pertenece a la clase de caracteres. ¿El objeto de personaje también pertenece a la clase de personaje?


Los dos tipos R char y character en el lado interno C corresponden a CHARSXP y STRSXP respectivamente. En el nivel R, uno siempre trata con objetos de character ; una sola cadena, como:

y <- "My name is hasnain"

en realidad es un objeto de character de longitud 1. Internamente, cada elemento de un character es un char , pero R no proporciona (AFAIK) una forma directa de extraer, crear y / o utilizar un char .

Aunque no puede crear un objeto char / CHARSXP con R puro, es sencillo obtenerlo a través de la interfaz R / C utilizando la función mkChar , que toma una cadena C estándar y la convierte en un CHARSXP . Por ejemplo, uno puede crear un archivo char.c :

#include <stdio.h> #include <stdlib.h> #include <R.h> #include <Rinternals.h> SEXP returnCHAR() { SEXP ret = PROTECT(mkChar("Hello World!")); UNPROTECT(1); return ret; }

Después de compilarlo a través de R CMD SHLIB char.c , desde el lado R:

dyn.load("char.so") #linux dll; extension varies across platforms x<-.Call("returnCHAR") x # <CHARSXP: "Hello World!"> typeof(x) #[1] "char" length(x) #[1] 12

Además de typeof y length , no encontré muchas otras funciones R que actúen en objetos char . ¡Incluso como el as.character no funciona! No pude extraer un char de un vector de character estándar, ni insertar este char en un vector de character existente (la asignación no funciona).

La función c coacciona a una list si un objeto es un char :

c(1,"a",x) #[[1]] #[1] 1 # #[[2]] #[1] "a" # #[[3]] #<CHARSXP: "Hello World!">

Podemos hacer uso de .Internal(inspect()) (advertencia: inspect es una función interna, no expuesta y, por lo tanto, puede cambiar en futuras versiones. No confíe en ella) para tener una idea de la estructura interna de un objeto . Hasta donde sé, los objetos char / CHARXSP se comparten entre los vectores de cadena para ahorrar memoria. Por ejemplo:

let<-letters[1:2] .Internal(inspect(let)) #@1aff2a8 16 STRSXP g0c2 [NAM(1)] (len=2, tl=0) # @1368c60 09 CHARSXP g0c1 [MARK,gp=0x61] [ASCII] [cached] "a" # @16dc7c0 09 CHARSXP g0c1 [MARK,gp=0x60] [ASCII] [cached] "b" mya<-"a" .Internal(inspect(mya)) #@3068710 16 STRSXP g0c1 [NAM(3)] (len=1, tl=0) # @1368c60 09 CHARSXP g0c1 [MARK,gp=0x61] [ASCII] [cached] "a"

Del resultado anterior, notamos dos cosas:

  • STRSXP objetos STRSXP son vectores de objetos CHARSXP , como mencionamos;
  • las cadenas se almacenan en un "grupo global": la cadena "a" se almacena en la misma dirección a pesar de haberse creado de forma independiente en dos objetos diferentes.

Según la respuesta de nicola

Los dos tipos R char y character en el lado interno C corresponden a CHARSXP y STRSXP respectivamente. En el nivel R, uno siempre trata con objetos de personajes; una sola cadena, como:

y <- "My name is hasnain"

En R, un fragmento de texto se representa como una secuencia de caracteres (letras, números y símbolos). El tipo de datos R proporciona el almacenamiento de secuencias de caracteres es carácter. Formalmente, el modo de un objeto que contiene cadenas de caracteres en R es "carácter".

Un objeto de caracteres se usa para representar valores de cadena en R. Convertimos objetos en valores de caracteres con la función as.character ():

> x = as.character(3.14) > x # print the character string [1] "3.14" > class(x) # print the class name of x [1] "character"

Carácter / cadena: cada elemento del vector es una cadena de uno o más caracteres. Los vectores de caracteres incorporados son letras y LETRAS que proporcionan las 26 letras minúsculas (y mayúsculas), respectivamente.

> y = c("a", "bc", "def") > length(y) [1] 3 > nchar(y) [1] 1 2 3 > y == "a" [1] TRUE FALSE FALSE > y == "b" [1] FALSE FALSE FALSE

Es tan simple como eso, sí, has percibido bien que y es un objeto de tipo char ad pertenece a la clase carácter / cadena, pero si y solo si ''a'' aquí la secuencia de caracteres que forman una cadena / carácter