2016-09-05 9 views
5

Bir işlevde, yerel ayarı değiştirmek, bazı şeyler yapmak ve sonra değiştirmek istiyorum. Çünkü yan etkiler kötüdür.R'deki yerel ayarı değiştirmek ve değiştirmek için güvenilir bir yol nedir?

old_locale <- Sys.getlocale() 

# do some stuff 

Sys.setlocale(old_locale) 

Ancak Sys.setlocale bir category ve locale bağımsız değişken gerektirir.

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

Tamam: Öte yandan

, Sys.getlocale() bana bu verir. Muhtemelen bununla başa çıkabilirim:

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) 

Sorun çözüldü!

... ya da değil mi?

Sys.setlocale(locale='C') 

Sys.getlocale() şimdi "C" döndürür! Bu, yukarıdaki anahtar-değer çözümleyici ile çalışmayacak.

Ve aniden, yereller veya Sys.getlocale()'un dönebileceği dizeler hakkında hiçbir şey bilmediğimi anlıyorum.

Herkes, yerel durumu kaydetmek ve geri yüklemek için güvenilir bir yol biliyor mu?

+0

Akıllı fikir, keşke bu kadar kolay olsaydı! Sys.setlocale tam olarak iki argüman, bir kategori ve bir yer alır. Örneğin LC_MONETARY argümanını kabul etmeyecektir. Kodunuzu çalıştırırken aşağıdaki hatayı alıyorum: 'Hata (işlev (kategori =" LC_ALL ", locale =" "): kullanılmayan argümanlar (" LC_MONETARY = English_Australia.1252 "," LC_NUMERIC = C "," LC_TIME = English_Australia) 0,1252") ​​' – logworthy

cevap

5

?Sys.getlocale diyor ki: dizesinin detayı sisteme özgü category = "LC_ALL" için

: tek yerel ismi veya "/" (Solaris, OS X) veya ayrılmış yerel adlarının bir dizi olabilir ";" (Windows, Linux). Taşınabilirlik için, kategorileri tek tek sorgulamak için en iyi olan : sonucunun Sys.setlocale("LC_ALL", locale = foo) içinde kullanılabilmesi zorunlu değildir. Eğer (ler) ayarını değiştirmek ve sadece bir tane (ler) gerekiyor değiştirmeniz gerekir yerel ayarları belirlemek gerekir iyisi

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

:

Yani böyle bir şey yapmak gerekir. Örneğin, tarih-zaman karakter dizilerini ayrıştırıyorsanız sadece LC_TIME değerini değiştirmeniz gerekebilir ya da karakter dizisi harmanlama sırasını değiştirmeniz gerekiyorsa LC_COLLATE değerini değiştirmeniz gerekebilir.

İlgili konular