获取R中字符串的长度,因为它将是`cat()`d(制表符处理)

获取R中字符串的长度,因为它将是`cat()`d(制表符处理),r,R,我有一个字符串,我想知道在终端上打印需要多少列nchar(…,type='w')应该这样做(我想),但我在选项卡方面遇到了问题 x <- 'foo\tbar' cat(x) # foo bar 如何获取在固定宽度字体终端中打印x所需的cat列数?我不能简单地用(比如)5个空格替换所有的\t,因为根据\t所在的列,它的宽度是可变的。使用capture.output(…)将选项卡捕获为选项卡(而不是转换为空格),因此不能使用它。有趣的问题 我想你可能只需要用下面的方法来暴力处理这个问

我有一个字符串,我想知道在终端上打印需要多少列
nchar(…,type='w')
应该这样做(我想),但我在选项卡方面遇到了问题

x <- 'foo\tbar'
cat(x)
# foo     bar
如何获取在固定宽度字体终端中打印
x
所需的
cat
列数?我不能简单地用(比如)5个空格替换所有的
\t
,因为根据
\t
所在的列,它的宽度是可变的。使用
capture.output(…)
将选项卡捕获为选项卡(而不是转换为空格),因此不能使用它。

有趣的问题

我想你可能只需要用下面的方法来暴力处理这个问题。(根据观察结果:(1)制表符至少使用一个空格显示;(2)每个以制表符结尾的子字符串分配一块空格,该空格是8个字符中能够容纳它的最小倍数。)


catLength哈!这正是我目前正在使用的解决方案。我只希望有更聪明一点的东西。干杯,山姆,我错过了什么
catLength(“1234567\tA”)#[1]9
如果制表符被空格替换,该值不应该大于9吗?@user1357015当您执行
cat(“1234567\tA”)
时,是否会得到占用9个空格以外的结果?啊,您是对的。我看到了九个空格。我看到了\t,并假设它自动放入制表符间距。这可能与我很久以前报告的
nchar
中的错误有关:
nchar(x) # 7
nchar(x, type='w') # 6
catLength <- function(x) {
    xx <- strsplit(x, "(?<=\\t)", perl=TRUE)[[1]]
    ii <- grepl("\\t", xx)
    sum(ii * 8*ceiling((nchar(xx) + 1)/8)) + sum(!ii*(nchar(xx)))
}

catLength("\t\t")
# [1] 16    
catLength("A")
# [1] 1
catLength("\tA")
# [1] 9
catLength("1234567\tA")
# [1] 9
catLength("12345678\tA")
# [1] 17
catLength("12345678\tAB")
# [1] 18