2

tl;dr

プラットフォームに依存LANGUAGEせずに環境設定 (またはLC_MESSAGESロケールのコンポーネント)を変更することは可能ですか? そうでない場合 (おそらくそうです)、要求された値が実際に合法的/有効であったかどうかを検出できますか?

環境

私の関数の 1 つはgrep()、エラー メッセージのテキストを ing することによって、特定のエラーの発生を検出しようとしました。LANGUAGE以前に R メーリング リストで指摘されたように (現在は参照先が見つかりません)、このアプローチは脆弱です。メッセージのテキストは、環境変数の設定に基づいて変更される可能性があります。

そこで、それを行わないようにコードを変更していますが、問題が発生するかどうかをテストするリグレッション テストをパッケージに追加したいと考えています。そして、プラットフォーム間で動作する (または少なくとも失敗しない) ことを望んでいます。

たとえば、この質問Sys.setenv(LANGUAGE=...)で説明されているように、またはSys.setlocale("LC_MESSAGES",.)メッセージ言語を変更することができます。しかし、これは正しいLANGUAGE/LC_MESSAGES値を推測した場合にのみ機能し、現在のシステムで利用可能です。(それLANGUAGEは言語コードでありLC_MESSAGES、ロケールであり、言語を切り替えたいだけの場合、ロケールをインストールする必要はないようです?)

Sys.getenv("LANGUAGE") ## [1] "en_CA:en"
test_msg <- function(msg,silent=FALSE) {
   grepl(msg,try(x ,silent=silent))
}
test_msg("not found") ## TRUE ("object 'x' not found")
Sys.setenv(LANGUAGE="fr")
test_msg("introuvable")
## Erreur : objet 'x' introuvable

ここまでは順調ですね。しかし、変数をリセットしてLANGUAGEもうまくいかないようです...

Sys.setenv(LANGUAGE="en")
Sys.getenv("LANGUAGE")=="en" ## TRUE
test_msg("not found")   ## FALSE ('introuvable')
Sys.setenv(LANGUAGE="en_CA:en")
test_msg("not found") ## FALSE ('introuvable')

Cに設定LC_MESSAGESするとより信頼できるようです...

Sys.setlocale("LC_MESSAGES", "C")
test_msg("not found")

FWIW この一連のコマンドは実際には信頼できないように見えることがわかりました。つまり、環境変数を設定する同じ試みが、以前に何をしたかによってはうまくいくようです...戻って開始し続ける必要があります再現可能な結果を​​得るためにクリーンなセッションで...

いずれにせよ、フランス語のロケールが利用できないコンピューター、またはロケール/言語名が異なるコンピューターでこれを試しても、うまくいかないことはわかっています。言語設定が機能しているかどうかを把握できるようにしたいと思います。ブルートフォースとして使用できますtest_msg("introuvable")が、もっとエレガントなオプションがあることを願っています...


の関連ビットsessionInfo():

R Under development (unstable) (2018-11-26 r75681)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.5 LTS
    
locale:
 [1] LC_CTYPE=en_CA.UTF8       LC_NUMERIC=C             
 [3] LC_TIME=en_CA.UTF8        LC_COLLATE=en_CA.UTF8    
 [5] LC_MONETARY=en_CA.UTF8    LC_MESSAGES=en_CA.UTF8  
4

0 に答える 0