當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R nchar 計算字符數(或字節數或寬度)


R語言 nchar 位於 base 包(package)。

說明

nchar 采用字符向量作為參數,並返回一個向量,其元素包含 x 相應元素的大小。在內部,它是一個泛型,可以為其定義方法(請參閱InternalMethods)。

nzchar 是一種快速查找字符向量元素是否為非空字符串的方法。

用法

nchar(x, type = "chars", allowNA = FALSE, keepNA = NA)

nzchar(x, keepNA = FALSE)

參數

x

字符向量,或強製轉換為字符向量的向量。給出一個因子是一個錯誤。

type

字符串:部分匹配 c("bytes", "chars", "width") 之一。查看具體信息'。

allowNA

邏輯:對於無效的多字節字符串或 "bytes" 編碼字符串是否應該返回 NA(而不是拋出錯誤)?

keepNA

邏輯:當 xNA 時,應該返回 NA 嗎?如果為 false,則 nchar() 返回 2 ,因為這是將字符串寫入輸出時使用的打印字符數,而 nzchar()TRUEnchar()NA 的默認值表示使用 keepNA = TRUE ,除非 type"width"

細節

字符串的‘size’可以通過以下三種方式之一進行測量(對應於type參數):

bytes

存儲字符串所需的字節數(加上 C 中未計算的最終終止符)。

chars

字符數。

width

cat 將用於以等寬字體打印字符串的列數。如果無法計算,則與chars 相同。

這些通常是相同的,並且通常采用單字節語言環境(但請注意 type 如何確定 keepNA 的默認值)。前兩者與多字節字符序列之間會有差異,例如在 UTF-8 語言環境中。

as.character 的默認方法的內部等效操作是在 x 上執行的(因此沒有方法分派)。如果您想對非矢量對象進行操作,則需要首先將它們傳遞給deparse

對於 nchar ,給出每個元素大小的整數向量。對於缺失值(即 NA ,即 NA_character_ ),如果 keepNA 為 true,則 nchar() 返回 NA_integer_;如果為 false,則 2 返回打印字符數。

type = "width" 給出(近似)以終端字體打印每個元素時使用的列數,考慮雙寬、zero-width 和 ‘composing’ 字符。當存在未分配或非打印字符時,近似值可能會很差。

如果 allowNA = TRUE 和某個元素在多字節字符集中(例如 UTF-8)被檢測為無效,則其字符數和寬度將為 NA 。否則字符數將為非負數,因此 !is.na(nchar(x, "chars", TRUE)) 是有效性測試。

"bytes" 編碼標記的字符串(參見 Encoding )有多個字節,但既不知道字符數,也不知道寬度,因此後兩種類型如果 allowNA = TRUE 則為 NA ,否則錯誤。

名稱、暗淡和暗淡名稱是從輸入複製的。

對於 nzchar ,與 x 長度相同的邏輯向量,當且僅當元素具有非零大小時為 true;如果元素是 NA ,則當 keepNA 為 false(默認)或 NA 時,nzchar() 為 true,否則為 NA

注意

這確實不是默認情況下給出將用於的字符數print()字符串。使用encodeString找到那個。如果字符串已標記為 UTF-8,則字符數和寬度將以 UTF-8 計算,即使打印可能使用轉義符,例如“⁠<U+2642>⁠’ 在非 UTF-8 語言環境中。

即使在等寬字體中,‘width’ 的概念也是一個難以捉摸的概念。一些人類語言具有組合字符的概念,其中兩個或多個字符呈現在一起:一個例子是 "y\u306" ,它是寬度為 1 的兩個字符:組合字符的寬度為 0,還有其他 zero-width字符,例如 zero-width 空格 "\u200b"

一些東亞語言有 ‘wide’ 字符,這些表意文字通常與 ASCII 和這些語言中的其他 ‘narrow’ 字符混合打印在兩列上。問題在於,計算機是否打印兩列或一列的寬字符取決於字體,在針對東亞用戶的字體中使用兩列和在“西方”字體中使用單列的情況並不罕見。 Unicode 具有 ‘fullwidth’ 版本的 ASCII 字符和 ‘halfwidth’ 版本的片假名(日語)和朝鮮文(韓語)字符的編碼。然後是“東亞模糊類”(希臘語、西裏爾字母、符號、一些帶重音的拉丁字符等),曆史上的做法是在東亞使用兩列,在其他地方使用一列。 nchar 為該類(以及其他一些類)中的字符引用的寬度取決於語言環境,除了某些操作係統(尤其是 Windows)上的某些東亞語言環境之外。

控製字符的寬度通常為零:這包括 CR 和 LF。應避免計算包含控製字符的字符串的寬度(並且可能取決於操作係統和R版本)。

例子

x <- c("asfef", "qwerty", "yuiop[", "b", "stuff.blah.yech")
nchar(x)
# 5  6  6  1 15

nchar(deparse(mean))
# 18 17  <-- unless mean differs from base::mean

## NA behaviour as function of keepNA=* :
logi <- setNames(, c(FALSE, NA, TRUE))
sapply(logi, \(k) data.frame(nchar =  nchar (NA, keepNA=k),
                             nzchar = nzchar(NA, keepNA=k)))

x[3] <- NA; x
nchar(x, keepNA= TRUE) #  5  6 NA  1 15
nchar(x, keepNA=FALSE) #  5  6  2  1 15
stopifnot(identical(nchar(x     ), nchar(x, keepNA= TRUE)),
          identical(nchar(x, "w"), nchar(x, keepNA=FALSE)),
          identical(is.na(x), is.na(nchar(x))))

##' nchar() for all three types :
nchars <- function(x, ...)
   vapply(c("chars", "bytes", "width"),
          function(tp) nchar(x, tp, ...), integer(length(x)))

nchars("\u200b") # in R versions (>= 2015-09-xx):
## chars bytes width
##     1     3     0

data.frame(x, nchars(x)) ## all three types : same unless for NA
## force the same by forcing 'keepNA':
(ncT <- nchars(x, keepNA = TRUE)) ## .... NA NA NA ....
(ncF <- nchars(x, keepNA = FALSE))## ....  2  2  2 ....
stopifnot(apply(ncT, 1, function(.) length(unique(.))) == 1,
          apply(ncF, 1, function(.) length(unique(.))) == 1)

參考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

Unicode Standard Annex #11: East Asian Width. https://www.unicode.org/reports/tr11/

也可以看看

strwidth 給出用於繪圖的字符串寬度; pastesubstrstrsplit

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Count the Number of Characters (or Bytes or Width)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。