当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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