【问题标题】:Sprintf in R doesn't count umlautsR中的Sprintf不计算变音符号
【发布时间】:2012-02-15 11:44:10
【问题描述】:

我有字符向量,我想确保向量的所有元素都具有相同的长度。因此,我用空格填充短元素,如下所示:

vec <- c("fjdlksa01dada","rau","sjklf")
x <- sprintf("%-15s", vec)
nchar(x)
# returns
[1] 15 15 15

喜欢我的previous question 建议的答案。这很好,但它似乎与变音符号有问题。例如,如果我的向量看起来像这样:

vec2 <- c("fjdlksa01dada","rauü","sjklf")
y <- sprintf("%-15s", vec)
nchar(y)
# returns
[1] 15 14 15

我在 Mac OS X (10.6) 上运行 R。我该如何解决这个问题?

编辑: 请注意,我不打算修复 nchar 的输出,因为它是正确的。问题是 sprintf 丢失了变音符号。

编辑:更新 R,更改为 DWins 语言环境 - 完全没有变化。但是:

vec2 <- c("fjdlksa01dada","rauü","sjklf")
Encoding(vec2)
# returns
[1] "unknown" "UTF-8"   "unknown"

奇怪。

【问题讨论】:

  • 无法在运行 10.5.8/Rv2.14.1 的 Mac 上重现 > Sys.getlocale() = "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C /en_US.UTF-8/en_US.UTF-8"。
  • 这很有趣。您是否有机会 - 手册/链接如何安装其他语言环境?另外,我应该更新 R,仍在运行 2.13.2
  • 更新到 2.14.1 没有帮助:(
  • 今天早上刚刚在 rhelp 上解决了一个问题,发帖人说她的语言环境设置与您复制的相同。它们是非标准的,因为 'UTF-8' 无效,Brian Ripley 想知道它们是如何做到的。 Sys.setlocale() 是用来改变它们的函数。
  • 您是否可以接受强制编码为 UTF-8 以外的其他内容?如Encoding(vec2) &lt;- "latin1"

标签: r printf diacritics


【解决方案1】:

我在?sprintf 页面上找到了这个:

如果 fmt 的任何元素或任何字符参数声明为 UTF-8,则结果元素将采用 UTF-8 并具有声明为 UTF-8 的编码。否则它将采用当前语言环境的编码。

输入取自 Rgui 的语言环境(我认为);见下文。

幸运的是它已经在 Windows 上打印了:

> vec2 <- c("fjdlksa01dada","rauü","sjklf")
> y <- sprintf("%-15s", vec)
> nchar(y)
[1] 15 15 15

认为在 MacOs 上你可以通过打开 R 来实现这一点,如下所示,但我没有任何 Mac 来实际测试这个:

Rgui --encoding=utf-8

【讨论】:

  • 我猜options("encoding") 也会有所帮助。
  • 好主意。不幸的是,我已经使用了 utf-8,在 R Studio 中,至少我的所有脚本都保存为 UTF-8,并且我的语言环境设置为“C/UTF-8/C/C/C/C”。但很高兴知道在 Windows sprintf 中可以正常工作。
  • @ran2 R 工作室?唔。您是否尝试过在Rgui --encoding=utf-8 中运行代码?如果它在 Rgui 中有效,那么您知道这是 R Studio 的错,并且知道在哪里寻找更多选项
  • 如果重要的话,它在 Linux 中也会失败(RStudio 和终端,无法测试 Rgui)
  • hmm 让我看看能不能找到一些东西,我这里有一台 linux 机器,所以至少我可以自己测试解决方法,感谢 nico 提及
【解决方案2】:

可能有一种更清洁的方法......但这有效:

sapply(vec, function(x){
      paste(x, paste(rep(" ", 13-nchar(x)), collapse=""), "")
      })

(有关 13 的 [非] 解释,请参阅下面的评论)

【讨论】:

  • hmm,如果我运行它,我的所有元素都是 17 个字符长,但我只想添加空格,直到总长度为 15 个字符。另请注意,我对最后的长度不感兴趣(只是发布了你们都不必计算的 nchar)——想要矢量元素本身。
  • @ran2: true... 奇怪... 它显然可以通过将 15 更改为 13... 但我不知道为什么。 sapply 的结果是元素的向量,而不是长度
  • +1 到目前为止的破解,因为它有帮助。尽管如此,我还是想知道如何以 sprintf 的方式真正解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 2019-01-10
  • 1970-01-01
  • 2018-04-12
  • 2018-11-17
  • 2015-10-16
相关资源
最近更新 更多