在R中更改然后更改区域设置的可靠方法是什么?

时间:2016-09-05 03:27:29

标签: r locale

在一个函数中,我想改变语言环境,做一些事情,然后不改变它。因为副作用很差。

old_locale <- Sys.getlocale()

# do some stuff

Sys.setlocale(old_locale)

但是,Sys.setlocale需要categorylocale参数。

另一方面,Sys.getlocale()给了我这个:

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

确定。我可以解决这个问题:

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()可能返回的语言环境或字符串范围一无所知。

有没有人知道保存和恢复语言环境状态的可靠方法?

1 个答案:

答案 0 :(得分:5)

?Sys.getlocale说:

  

对于category = "LC_ALL",字符串的详细信息是系统特定的:   它可能是单个区域设置名称或一组区域设置名称   "/"(Solaris,OS X)或";"(Windows,Linux)。为了便携性,它是   最好单独查询类别:不一定是这种情况   可以使用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。