split用法 - r資料處理




字符對象與字符對象之間的區別 (2)

根據語言定義

“ char”:“標量”字符串對象(僅內部)***
“字符”:包含字符值的向量

用戶無法輕鬆掌握帶有“ ***”標記的類型的對象。

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

類函數告訴'y'屬於字符類。 我已經知道“ y”是字符類型的對象,屬於字符類。 角色對像也屬於角色類嗎?


內部C側的兩個R類型 charcharacter 分別對應於 CHARSXPSTRSXP 。 在R級別,總是處理 character 對象。 單個字符串,例如:

y <- "My name is hasnain"

實際上是一個長度為1的 character 對象。在內部, character 每個元素都是一個 char ,但是R不提供(AFAIK)直接提取,創建和/或使用 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;
}

從R端通過 R CMD SHLIB char.c 編譯之後:

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

除了 typeoflength 之外,我沒有發現許多其他用於 char 對象的R函數。 即使 as.character 也不起作用! 我既不能從標準 character 向量中提取一個 char ,也不能將此 char 插入現有的 character 向量中(分配不起作用)。

如果對像是 charc 函數強制轉換為 list

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

我們可以使用 .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"

從上面的輸出中,我們注意到兩件事:

  • STRSXPCHARSXPCHARSXP STRSXP 對象的向量。
  • 字符串存儲在“全局池”中:儘管在兩個不同的對像中分別創建 "a" 字符串,但 "a" 字符串存儲在相同的地址中。

根據 尼古拉的回答

內部C側的兩個R類型char和character分別對應於CHARSXP和STRSXP。 在R級別,總是處理角色對象。 單個字符串,例如:

y <- "My name is hasnain"

在R中,一段文本表示為一系列字符(字母,數字和符號)。 R提供的用於存儲字符序列的數據類型是character。 形式上,在R中保存字符串的對象的模式是“字符”。

字符對像用於表示R中的字符串值。我們使用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"

字符/字符串–向量中的每個元素都是一個或多個字符的字符串。 內置的字符向量是字母和字母,分別提供26個小寫(和大寫)字母。

> 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

這很簡單,是的,您已經正確地意識到y是char ad類型的對象,但它屬於字符/字符串類,但是當且僅當'a'此處的字符序列形成字符串/字符





r