字符对象与字符对象之间的区别

Has*_*ain 21 r

根据语言定义

“ char”:“标量”字符串对象(仅内部)***
“ character”:包含字符值的向量

用户无法轻松掌握带有“ ***”标记的类型的对象。

y <- "My name is hasnain"
class(y)
Run Code Online (Sandbox Code Playgroud)

类函数告诉'y'属于字符类。我已经知道“ y”是字符类型的对象,属于字符类。角色对象也属于角色类吗?

nic*_*ola 33

两个R类型char以及character在内部C侧对应于CHARSXPSTRSXP分别。在R级别,总是处理character对象。单个字符串,例如:

y <- "My name is hasnain"
Run Code Online (Sandbox Code Playgroud)

实际上是character长度为1 的对象。在内部,a的每个元素character都是a char,但是R不提供(AFAIK)直接提取,创建和/或使用a的方式char

尽管您无法使用纯R 创建一个char/ CHARSXP对象,但使用该mkChar函数通过R / C接口直接获取它很简单,该函数接受标准C字符串并将其转换为CHARSXP。例如,可以创建一个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;
}
Run Code Online (Sandbox Code Playgroud)

R CMD SHLIB char.cR端通过编译之后:

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
Run Code Online (Sandbox Code Playgroud)

此外typeoflength我没有发现许多其他作用于char对象的R函数。甚至as.character不起作用!我既无法char从标准character向量中提取,也无法将其插入char到现有character向量中(分配无效)。

如果对象是a,则该c函数强制转换list为a char

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

我们可以利用.Internal(inspect())(警告:inspect是一个内部函数,而不是公开的函数,因此它可能会在将来的发行版中更改。不要依赖它)来了解对象的内部结构。据我所知,char/ CHARXSP对象在字符串向量之间共享以节省内存。例如:

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"
Run Code Online (Sandbox Code Playgroud)

从上面的输出中,我们注意到两件事:

  • STRSXPCHARSXP如前所述,对象是对象的向量;
  • 字符串存储在“全局池”中:"a"尽管在两个不同的对象中分别创建了字符串,但该字符串存储在相同的地址中。

  • 好答案!我认为可能会改善的一件事是解决OP的困惑,因为“我的名字是hasnain”是长度为1的字符向量,而不是“ char”对象 (3认同)