2012-02-15 43 views
5

我有矢量字符,我想確保矢量的所有元素都具有相同的長度。因此,我用空格填充短元素,如下所示:R中的Sprintf不計算變音符號

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,更改爲德文語言環境 - 根本沒有變化。但是:

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

奇怪。

+0

無法在運行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" 。 – 2012-02-15 13:11:24

+0

這非常有趣。你有 - 偶然 - 手冊/鏈接如何安裝其他語言環境?另外,我應該更新R,仍然運行2.13.2 – 2012-02-15 13:49:57

+0

更新到2.14.1沒有幫助:( – 2012-02-15 14:03:38

回答

1

有可能是一個更清潔的方式......但這個工程:

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

(見下文評論的[非] -explication爲13)

+0

嗯,如果我運行這個,我所有的元素都是17個字符長,但我只想追加空格直到總長度爲15個字符。還要注意,我最後對長度不感興趣(只是發佈了nchar,你們都不需要計數) - 想要向量元素本身。 – 2012-02-15 11:58:27

+0

@ ran2:真...怪異......它顯然是通過改變15爲13 ...但我不知道爲什麼。 sapply的結果是一個元素的矢量,而不是長度爲 – nico 2012-02-15 12:48:18

+0

+1爲黑客到目前爲止,因此它的幫助。儘管我想知道如何真正解決這個sprintf方式。 – 2012-02-15 14:20:14

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 
+0

我猜'options(「encoding」)'也會有幫助。 – 2012-02-15 12:54:51

+0

好想法。不幸的是,我已經在R Studio中使用utf-8,至少我所有的腳本都保存爲UTF-8,並且我的語言環境設置爲「C/UTF-8/C/C/C/C」。但很高興知道在Windows sprintf工作正常。 – 2012-02-15 12:56:17

+0

@ ran2 R Studio?嗯。你有沒有嘗試在'Rgui --encoding = utf-8'中運行代碼?如果它在Rgui工作,那麼你知道這是R Studio的錯,並知道在哪裏尋找更多的選擇 – 2012-02-15 13:04:12