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 caracteresLos 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
objetosSTRSXP
son vectores de objetosCHARSXP
, 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