nchar
位於 base
包(package)。 說明
nchar
采用字符向量作為參數,並返回一個向量,其元素包含 x
相應元素的大小。在內部,它是一個泛型,可以為其定義方法(請參閱InternalMethods)。
nzchar
是一種快速查找字符向量元素是否為非空字符串的方法。
用法
nchar(x, type = "chars", allowNA = FALSE, keepNA = NA)
nzchar(x, keepNA = FALSE)
參數
x |
字符向量,或強製轉換為字符向量的向量。給出一個因子是一個錯誤。 |
type |
字符串:部分匹配 |
allowNA |
邏輯:對於無效的多字節字符串或 |
keepNA |
邏輯:當 |
細節
字符串的‘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/
也可以看看
相關用法
- R noquote “無引號”字符串打印類
- R numeric 數值向量
- R numeric_version 數字版本
- R ns-dblcolon 雙冒號和三冒號運算符
- R nargs 函數的參數數量
- R ns-internals 命名空間內部結構
- R ns-reflect 命名空間反射支持
- R normalizePath 以規範形式表達文件路徑
- R ns-hooks 命名空間事件的鉤子
- R ns-load 加載和卸載命名空間
- R norm 計算矩陣的範數
- R name 名稱和符號
- R nrow 數組的行/列數
- R names 對象的名稱
- R ns-topenv 頂級環境
- R nlevels 因子的水平數
- R file.path 構造文件路徑
- R grep 模式匹配和替換
- R getwd 獲取或設置工作目錄
- R vector 向量 - 創建、強製等
- R lapply 對列表或向量應用函數
- R dump R 對象的文本表示
- R Sys.getenv 獲取環境變量
- R rank 樣本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Count the Number of Characters (or Bytes or Width)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。