2017-06-23 15 views
1

以下のコードを参照してください。日付を変換できるようにロケールを変更する必要があります。最初の試行は失敗し、2度目の試行はうまくいきますが、冗長であり、Sys.getlocaleの出力は変わりません。Sys.setlocaleの予期しない動作

私のOSは、私が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() # "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

+0

:-)機能では、それはロケールと日付の書式に関するすべての質問に重要だが、あまりにもそれにあなたのOS情報を追加します。また、 'Sys.setlocale(locale =" UK ")の代わりに' Sys.setlocale(locale = "English_United Kingdom") 'を実行するとどうなりますか? –

+0

更新された回答を参照してください –

+1

私はいくつかのテストをやっていますが、何かが欠けていない限り、これはバグのようです。わかるべきことは、バグが実際にどこに座っているかだけです。それはRかもしれないが、これもWindowsかもしれない。今夜は別のシステムでチェックし、更新しておきます。私はR-develにも投稿しました.Rの専門家の中には、これについての光を照らすことができるという希望で、http://r.789695.n4.nabble.com/LC-TIME-not-set-correctly-by- Sys-setlocale-td4740135.html –

答えて

0

としてanswer of prof. dr. Brian Ripley

これはWindowsでの動作です。他のシステムでは、strptime()をフォーマットする基本機能はOS特有のstrptime機能を使用しますが、Windowsはそれを持っていません。だから、Rは英語以外の日や月の名前の場合に代用関数を使う。あなたはフランス語で標準的なロケールを持っているので、あなたのRはフランスの日と月の名前/略語を認識するように設定されています。

このstrptimeの代用関数は、曜日と月名の独自のマッピングを使用しますが、このマッピングは、"LC_TIME"が特に設定されている場合にのみリフレッシュされます。少なくとも、同じメカニズムを使用するR 3.4.0以前のバージョンの場合です。私の第一印象に

だから、逆に、これはバグではなく、

+1

Sys.getlocaleがLC_TIMEの不正確な情報を返すようにする機能ですが、 –

+0

@Moody_Mudskipper実際にはありません。 "feature"は 'strptime()'で、LC_TIMEの変更を正しく検出しません。 –