2016-09-05 5 views
5

किसी फ़ंक्शन के भीतर, मैं लोकेल को बदलना चाहता हूं, कुछ सामान कर सकता हूं, फिर इसे अपरिवर्तित कर सकता हूं। क्योंकि दुष्प्रभाव खराब हैं।आर बदलने के लिए एक विश्वसनीय तरीका क्या है और फिर आर में लोकेल को अपरिवर्तित करें?

old_locale <- Sys.getlocale() 

# do some stuff 

Sys.setlocale(old_locale) 

हालांकि, Sys.setlocale एक category और locale तर्क की आवश्यकता है।

"LC_COLLATE=English_Australia.1252;LC_CTYPE=English_Australia.1252;LC_MONETARY=English_Australia.1252;LC_NUMERIC=C;LC_TIME=English_Australia.1252" 

ठीक है:

दूसरी ओर, Sys.getlocale() मुझे इस देता है। मैं शायद इस से निपट सकता हूं:

old_locale <- Sys.getlocale() 
locale_key_values <- strsplit(strsplit(old_locale, ';')[[1]], '=')[[1]], '=') 
locale_keys <- lapply(locale_key_values, getElement, name=1) 
locale_values <- lapply(locale_key_values, getElement, name=2) 

# do some stuff 

mapply(Sys.setlocale, category=locale_keys, locale=locale_values) 

समस्या हल हो गई!

... या यह है?

Sys.setlocale(locale='C') 

Sys.getlocale() अब "C" रिटर्न! यह उपरोक्त मेरे कुंजी-मूल्य पार्सर के साथ काम नहीं करेगा।

और मुझे अचानक एहसास हुआ कि मुझे स्थानीय लोगों या स्ट्रिंग्स की श्रेणी के बारे में कुछ भी पता नहीं है जो Sys.getlocale() वापस आ सकता है।

क्या किसी को स्थानीय राज्य को बचाने और पुनर्स्थापित करने के लिए एक विश्वसनीय तरीका पता है?

+0

चालाक विचार, मेरी इच्छा है कि यह इतना आसान हो! Sys.setlocale बिल्कुल दो तर्क, एक श्रेणी और एक लोकेल लेता है। यह उदाहरण के लिए एक एलसी_MONETARY तर्क स्वीकार नहीं करेगा। मुझे आपका कोड चलाते समय निम्न त्रुटि मिलती है: 'त्रुटि (फ़ंक्शन (श्रेणी = "एलसी_ALL", लोकेल = ""): अप्रयुक्त तर्क ("एलसी_MONETARY = अंग्रेज़ी_ऑस्ट्रेलिया .1252", "एलसी_NUMERIC = सी", "एलसी_TIME = अंग्रेज़ी_ऑस्ट्रेलिया 0.1252 ")' – logworthy

उत्तर

5

?Sys.getlocale का कहना है:

category = "LC_ALL" के लिए स्ट्रिंग का ब्यौरा प्रणाली विशेष कर रहे हैं: यह एक एकल स्थान नाम या द्वारा "/" (सोलारिस, ओएस एक्स) या अलग स्थान के नाम का एक सेट हो सकता है ";" (विंडोज़, लिनक्स)। पोर्टेबिलिटी के लिए, यह व्यक्तिगत रूप से क्वेरी श्रेणियों के लिए सबसे अच्छा है: यह आवश्यक नहीं है कि foo <- Sys.getlocale() का परिणाम Sys.setlocale("LC_ALL", locale = foo) में उपयोग किया जा सकता है।

तो तुम जैसे कुछ करने की जरूरत है: बेहतर अभी तक

localeCategories <- c("LC_COLLATE","LC_CTYPE","LC_MONETARY","LC_NUMERIC","LC_TIME") 
locales <- setNames(lapply(localeCategories, Sys.getlocale), localeCategories) 

, आप यह निर्धारित करना चाहिए जो सेटिंग में ऐसे स्थान (रों) आप बदलना चाहते हैं, और केवल एक ही (रों) आप की जरूरत को बदलने की जरूरत है। उदाहरण के लिए, यदि आप दिनांक-समय के चरित्र तारों को पार्स कर रहे हैं, तो आपको केवल LC_TIME को बदलने की आवश्यकता हो सकती है, या यदि आपको वर्ण स्ट्रिंग कॉलेशन ऑर्डर बदलने की आवश्यकता है तो आपको केवल LC_COLLATE को बदलने की आवश्यकता हो सकती है।

संबंधित मुद्दे