Sys.setlocale的意外行为

时间:2017-06-23 14:19:26

标签: r locale

请参阅下面的代码,我必须更改我的区域设置才能转换日期。我的第一次尝试是不成功的,我的第二次尝试是有效的,虽然它似乎是多余的,并没有改变Sys.getlocale的输出。

我的操作系统是Windows 7 64位

Sys.getlocale() # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252"
date <- "Dec-11"
as.Date(date, format = "%b-%d")     # NA
Sys.setlocale(locale = "UK")        # "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"
locale2 <- Sys.getlocale()
as.Date(date, format = "%b-%d")     # NA
Sys.setlocale("LC_TIME", "English_United Kingdom")
locale3 <- Sys.getlocale()          # "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"
as.Date(date, format = "%b-%d")     # "2017-12-11"
locale2 == locale3                  # TRUE

我可以跳过对Sys.getlocale的第一次通话,日期转换将有效:

Sys.getlocale() # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252"
date <- "Dec-11"
as.Date(date, format = "%b-%d")     # NA
Sys.setlocale("LC_TIME", "English_United Kingdom") # 
locale4 <- Sys.getlocale()          # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"
as.Date(date, format = "%b-%d")     # "2017-12-11"

但这不起作用:

Sys.getlocale() # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252"
date <- "Dec-11"
as.Date(date, format = "%b-%d")     # NA
Sys.setlocale(locale = "English_United Kingdom") #
locale5 <- Sys.getlocale()          # "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"
as.Date(date, format = "%b-%d")     # NA

这与此问题有关:Converting integer format date to double format of date

1 个答案:

答案 0 :(得分:0)

根据answer of prof. dr. Brian Ripley

这是Windows中的预期行为。在其他系统上,格式化range = 1..999 multiple_of_3_or_5? = fn(n) -> (rem(n, 3) == 0 || rem(n, 5) == 0) end for n <- range, multiple_of_3_or_5?.(n) do n end |> Enum.reduce(0, fn(x, acc) -> x + acc end) 的基础函数使用特定于操作系统的strptime函数,但Windows没有。因此,在非英语日或月名的情况下,R使用替代函数。由于您在法语中使用标准语言环境,因此您的R设置为识别法语日期和月份名称/缩写。

strptime的这个替换函数使用它自己的日期和月份名称的映射,但只有在专门设置range = 1..999 multiple_of_3_or_5? = fn(n) -> (rem(n, 3) == 0 || rem(n, 5) == 0) end Enum.reduce_while(range, 0, fn i, acc -> if multiple_of_3_or_5?.(i), do: {:cont, acc + i}, else: {:cont, acc} end) 时才会刷新此映射。至少在使用相同机制的R 3.4.0和早期版本中就是这种情况。

与我的第一印象相反,这不是一个错误,而是一个特征: - )