Sprintf в R не считает умлаутс - PullRequest
5 голосов
/ 15 февраля 2012

У меня есть вектор символов, и я хочу убедиться, что все элементы вектора имеют одинаковую длину. Поэтому я заполняю короткие элементы пробелами, например:

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

как ответы на мой предыдущий вопрос предлагается. Это нормально, но, похоже, проблемы с умлаутами. Например, если мой вектор выглядит так:

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

Я использую R в Mac OS X (10.6). Как я могу это исправить?

EDIT: Обратите внимание, я не ищу исправить вывод nchar, потому что это правильно. Проблема в том, что sprintf теряет умлаут.

РЕДАКТИРОВАТЬ: обновление R, изменено на локали DWins - без изменений вообще. Но:

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

странно.

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Я нашел это на странице ?sprintf:

Если какой-либо элемент fmt или любой символьный аргумент объявлен как UTF-8, элемент результата будет в UTF-8 ииметь кодировку, объявленную как UTF-8.В противном случае он будет в кодировке текущей локали.

Ввод берет свою локаль из локали Руи (я думаю);см. ниже.

На окнах, к счастью, он уже печатает:

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

I Думаю, на MacO вы можете добиться этого с открытием R, как показано ниже, но у меня нетлюбой Mac здесь, чтобы проверить это:

Rgui --encoding=utf-8
1 голос
/ 15 февраля 2012

Вероятно, есть более чистый путь ... но это работает:

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

(см. Комментарий ниже для [не] -экспликации для 13)

...