在一个函数中,我想改变语言环境,做一些事情,然后不改变它.因为副作用很差.
old_locale <- Sys.getlocale()
# do some stuff
Sys.setlocale(old_locale)
Run Code Online (Sandbox Code Playgroud)
但是,Sys.setlocale
需要category
和locale
论证.
另一方面,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"
Run Code Online (Sandbox Code Playgroud)
好.我可以处理这个问题:
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)
Run Code Online (Sandbox Code Playgroud)
问题解决了!
......或者是吗?
Sys.setlocale(locale='C')
Run Code Online (Sandbox Code Playgroud)
Sys.getlocale()
现在回来了"C"
!这不适合我上面的键值解析器.
我突然意识到我对locales或Sys.getlocale()
可能返回的字符串范围一无所知.
有谁知道保存和恢复语言环境状态的可靠方法?
?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)
Run Code Online (Sandbox Code Playgroud)
更好的是,您应该确定需要更改的区域设置,并且只更改您需要的区域设置.例如,如果要解析日期时间字符串,则可能只需要更改LC_TIME,或者如果需要更改字符串整理顺序,则可能只需要更改LC_COLLATE.