2012-02-15 13 views
5

मेरे पास वर्णों का वेक्टर है और मैं यह सुनिश्चित करना चाहता हूं कि वेक्टर के सभी तत्वों की लंबाई समान है। मेरी previous question सुझाव के जवाब की तरहआर में स्प्रिंटफ umlauts की गणना नहीं करता

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 

मै मैक ओएस एक्स (10.6) पर आर चला रहा हूं। मैं इसे कैसे ठीक करूं?

संपादित करें: नोट, मैं nchar के आउटपुट को ठीक करने की तलाश नहीं कर रहा हूं क्योंकि यह सही है। समस्या यह है कि sprintf उमोट खो देता है।

संपादित करें: अद्यतन आर, डीविन्स लोकेल में बदल गया - बिल्कुल कोई बदलाव नहीं। लेकिन:

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

अजीब।

+0

मैक पर पुन: उत्पन्न करने में असमर्थ 10.5.8/Rv2.14.1> Sys.getlocale() = "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF- 8/en_US.UTF-8 "। –

+0

यह बहुत दिलचस्प है। क्या आपके पास मौका है - एक मैनुअल/लिंक अन्य लोकेशंस कैसे स्थापित करें? इसके अलावा, मुझे आर अपडेट करना चाहिए, अभी भी 2.13.2 –

+0

2.14.1 पर अपडेट करने में मदद नहीं मिली :( –

उत्तर

1

शायद एक क्लीनर तरीका है ... लेकिन यह काम करता है:

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

+0

हम्म, अगर मैं इसे चलाता हूं, तो मेरे सभी तत्व 17 वर्ण लंबे होते हैं, लेकिन मैं केवल कुल लंबाई के 15 वर्ण तक रिक्त स्थान जोड़ना चाहता हूं। ध्यान दें, कि मुझे अंत में लंबाई में दिलचस्पी नहीं है (केवल nchar पोस्ट किया गया है जिसे आपको गिनना नहीं है) - वेक्टर तत्व स्वयं चाहते हैं। –

+0

@ ran2: सच ... विचित्र ... यह स्पष्ट रूप से 13 के लिए 15 बदलकर काम करता है ... लेकिन मुझे यकीन नहीं है कि क्यों। Sapply का परिणाम तत्वों का एक वेक्टर है, वैसे भी लंबाई हैक – nico

+0

+1 हैक के लिए अब तक, क्योंकि इससे मदद मिलती है। फिर भी मैं यह जानना चाहता हूं कि स्प्रिंटफ तरीके को वास्तव में कैसे ठीक किया जाए। –

1

(13 के लिए [गैर] -explication के लिए नीचे टिप्पणी देखें) मैं ?sprintf पृष्ठ पर इस पाया :

fmt या किसी चरित्र तर्क के किसी भी तत्व को UTF-8 के रूप में घोषित किया गया है, परिणाम के तत्व UTF-8 में हो सकता है और एन्कोडिंग UTF-8 के रूप में घोषित किया जाएगा। अन्यथा यह वर्तमान लोकेल के एन्कोडिंग में होगा।

इनपुट अपने स्थानीय लोगों को रुगुई के लोकेल (मुझे लगता है) से लेता है; निचे देखो।

खिड़कियों पर यह सौभाग्य से पहले से ही प्रिंट:

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

मैं MacOS पर लगता आप निम्नलिखित की तरह उद्घाटन आर के साथ इस लक्ष्य को हासिल कर सकते हैं, लेकिन मुझे नहीं वास्तव में इस परीक्षण करने के लिए यहां किसी भी मैक है:

Rgui --encoding=utf-8 
+0

मुझे लगता है कि 'विकल्प ("एन्कोडिंग")' मदद भी होगी। –

+0

अच्छा विचार। दुर्भाग्य से मैं पहले से ही utf-8 का उपयोग करें, आर स्टूडियो के भीतर कम से कम मेरे सभी लिपियों UTF-8 में सहेजे जाते हैं और मेरे स्थान के लिए 'सी/UTF-8/सी/सी/सी/सी "पर सेट है। लेकिन विंडोज स्प्रिंटफ में जानना अच्छा लगता है सही ढंग से काम करता है। –

+0

@ ran2 आर स्टूडियो? हम्म। क्या आपने 'Rgui --encoding = utf-8' में कोड चलाने का प्रयास किया है? यह Rgui में काम करता है, तो आप जानते हैं कि यह आर स्टूडियो की गलती है और पता है, जहां अधिक विकल्प –