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)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。