“ char”:“标量”字符串对象(仅内部)***
“ character”:包含字符值的向量用户无法轻松掌握带有“ ***”标记的类型的对象。
y <- "My name is hasnain"
class(y)
Run Code Online (Sandbox Code Playgroud)
类函数告诉'y'属于字符类。我已经知道“ y”是字符类型的对象,属于字符类。角色对象也属于角色类吗?
nic*_*ola 33
两个R类型char以及character在内部C侧对应于CHARSXP与STRSXP分别。在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)
此外typeof,length我没有发现许多其他作用于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"尽管在两个不同的对象中分别创建了字符串,但该字符串存储在相同的地址中。| 归档时间: |
|
| 查看次数: |
562 次 |
| 最近记录: |