更改然后取消更改 R 语言环境的可靠方法是什么?
What is a reliable way to change and then unchange the locale in R?
在一个函数中,我想更改语言环境,做一些事情,然后取消更改。因为副作用不好。
old_locale <- Sys.getlocale()
# do some stuff
Sys.setlocale(old_locale)
但是,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"
好的。我大概可以处理这个:
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()
现在 return 秒 "C"
!这不适用于我上面的键值解析器。
然后我突然意识到,我对 Sys.getlocale()
可能 return 的区域设置或字符串范围一无所知。
有谁知道保存和恢复语言环境状态的可靠方法吗?
?Sys.getlocale
说:
For category = "LC_ALL"
the details of the string are system-specific:
it might be a single locale name or a set of locale names separated by
"/"
(Solaris, OS X) or ";"
(Windows, Linux). For portability, it is
best to query categories individually: it is not necessarily the case
that the result of foo <- Sys.getlocale()
can be used in
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。
在一个函数中,我想更改语言环境,做一些事情,然后取消更改。因为副作用不好。
old_locale <- Sys.getlocale()
# do some stuff
Sys.setlocale(old_locale)
但是,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"
好的。我大概可以处理这个:
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()
现在 return 秒 "C"
!这不适用于我上面的键值解析器。
然后我突然意识到,我对 Sys.getlocale()
可能 return 的区域设置或字符串范围一无所知。
有谁知道保存和恢复语言环境状态的可靠方法吗?
?Sys.getlocale
说:
For
category = "LC_ALL"
the details of the string are system-specific: it might be a single locale name or a set of locale names separated by"/"
(Solaris, OS X) or";"
(Windows, Linux). For portability, it is best to query categories individually: it is not necessarily the case that the result offoo <- Sys.getlocale()
can be used inSys.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。