r - 在 R 中更改然后不更改语言环境的可靠方法是什么?

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

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

最佳答案

?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。

关于r - 在 R 中更改然后不更改语言环境的可靠方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39323532/

相关文章:

r - 如何在调试 session 期间跳过命令或代码行

r - 如何在不使用循环的情况下将自己的矩阵的奇数行相乘以获得向量

mysql - 如何在 RODBC 中为 MySQL 设置字符集?

javascript - Controller 内的 Angular Filter Service

vb6 - 从 DLL res 文件中将希伯来语字符串读入 VB6

R:如何应用为多列输出数据帧的函数(使用 dplyr)?

r - 模拟来自(非标准)密度函数的数据

c++ - 是否有存储 std::locale 源文件?

java - 中文文件名的 InvalidPathException

c++ - en_US.UTF-8 语言环境的 Windows 等效项是什么?