web-dev-qa-db-ja.com

UTF-8エンコーディングを使用して保存された.Rファイルをsource()する方法は?

以下は、Rに直接コピーして貼り付けると正常に機能します。

> character_test <- function() print("R同时也被称为GNU S是一个强烈的功能性语言和环境,探索统计数据集,使许多从自定义数据图形显示...")
> character_test()
[1] "R同时也被称为GNU S是一个强烈的功能性语言和环境,探索统计数据集,使许多从自定义数据图形显示..."

ただし、EXACT SAMEコードを含むcharacter_test.Rというファイルを作成した場合、TF-8エンコードで保存(特殊な漢字を保持するため)、source()でR、次のエラーが表示されます。

> source(file="C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "UTF-8")
Error in source(file = "C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "utf-8") : 
  C:\Users\Tony\Desktop\character_test.R:3:0: unexpected end of input
1: character.test <- function() print("R
2: 
  ^
In addition: Warning message:
In source(file = "C:\\Users\\Tony\\Desktop\\character_test.R", encoding = "UTF-8") :
  invalid input found on input connection 'C:\Users\Tony\Desktop\character_test.R'

ここで何が起こっているのかを理解し、解決するためにあなたが提供できる支援は大歓迎です。

> sessionInfo() # Windows 7 Pro x64
R version 2.12.1 (2010-12-16)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252 
[2] LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

loaded via a namespace (and not attached):
[1] tools_2.12.1

そして

> l10n_info()
$MBCS
[1] FALSE

$`UTF-8`
[1] FALSE

$`Latin-1`
[1] TRUE

$codepage
[1] 1252
38
Tony Breyal

これについては以前の投稿へのコメントでよく話しましたが、コメントの3ページ目でこれが失われないようにしたいです。ロケールを設定する必要があり、Rコンソールからの両方の入力で機能します(スクリーンショットを参照)コメント)、ファイルからの入力とともに、このスクリーンショットを参照してください:

ファイル「myfile.r」には以下が含まれます。

russian <- function() print ("Американские с...");

コンソールには以下が含まれます。

source("myfile.r", encoding="utf-8")
> Error in source(".....
Sys.setlocale("LC_CTYPE","ru")
> [1] "Russian_Russia.1251"
russian()
[1] "Американские с..."

ファイルインが失敗し、元のポスターのエラー(「R」の後のエラー)と同じ文字を指していることに注意してください。「Microsoft Pinyin IME 3.0」をインストールする必要があるため、中国語ではこれができません。同じですが、ロケールを「中国語」に置き換えるだけです(命名が少し矛盾しています。ドキュメントを参照してください)。

25
Bernd Elkemann

R/Windowsでは、sourceは、現在のロケール(またはWindowsのANSIコードページ)で表現できないUTF-8文字の問題に直面します。また、残念ながらWindowsにはANSIコードページとして使用可能なUTF-8がありません。Windowsには、ANSIコードページがUTF- 8。

これは根本的な解決不可能な問題ではないようです。source関数には何か問題があります。代わりにこれを行うことで、そこにある方法の90%を取得できます。

_eval(parse(filename, encoding="UTF-8"))
_

これは、source()とほぼ同じように機能しますが、デフォルトの引数を使用しますが、echo = T、eval.print = Tなどは実行できません。

26
Joe Cheng

問題はRにあると思います。UTF-8ファイル、または多くの非ASCII文字を含むUCS-2LEファイルを問題なくソースできます。たとえば、次の

danish <- function() print("Skønt H. C. Andersens barndomsomgivelser var meget fattige, blev de i hans rige fantasi solbeskinnede.")
croatian <- function() print("Dodigović. Kako se Vi zovete?")
new_testament <- function() print("Ne provizu al vi trezorojn sur la tero, kie tineo kaj rusto konsumas, kaj jie ŝtelistoj trafosas kaj ŝtelas; sed provizu al vi trezoron en la ĉielo")
russian <- function() print ("Американские суда находятся в международных водах. Япония выразила серьезное беспокойство советскими действиями.")

uTF-8とUCS-2LEの両方でロシア語の行がなくても問題ありません。しかし、それが含まれていると失敗します。私はRに指を向けています。あなたの中国語のテキストは、WindowsのRには難しすぎるようです。

ロケールはここでは無関係のようです。それは単なるファイルです。ファイルのエンコーディングを教えてください。なぜロケールが重要なのでしょうか?

5
David Heffernan

私(Windows)の場合:

source.utf8 <- function(f) {
    l <- readLines(f, encoding="UTF-8")
    eval(parse(text=l),envir=.GlobalEnv)
}

正常に動作します。

5
crow16384

Windowsでは、Unicodeまたはutf-8でエンコードされた文字列をシングルバイト入力(ロケールに応じてASCII ...)に設定されたテキストコントロールにコピーアンドペーストすると、不明なバイトが疑問符に置き換えられます。私はあなたの文字列の最初の4文字を取り、それをコピーして貼り付ける場合メモ帳で保存すると、ファイルは16進数になります。

52 3F 3F 3F 3F

あなたがしなければならないのは、utf-8に設定できるエディタを見つけることですbeforeテキストをコピーアンドペーストすると、保存されたファイル(最初の4文字)は次のようになります:

52 E5 90 8C E6 97 B6 E4 B9 9F E8 A2 AB

これは、[R]によって有効なutf-8として認識されます。

私はこれを試すために「Notepad2」を使用しましたが、もっとたくさんあると確信しています。

1
Bernd Elkemann

いくつかの漢字を含む.Rファイルを入手しようとすると、この問題が発生します。私の場合、「LC_CTYPE」を「chinese」に設定するだけでは不十分であることがわかりました。ただし、「LC_ALL」を「chinese」に設定するとうまく機能します。

Rstudio(またはR?)で非ASCIIを使用してプレーンテキストファイルを読み書きする場合、エンコードを取得するだけでは不十分であることに注意してください。ロケール設定もカウントされます。

PS。コマンドはSys.setlocale(category = "LC_CTYPE"、locale = "chinese")です。それに応じてロケール値を置き換えてください。

1
user2473519

crow's answer に基づいて、このソリューションはRStudioSourceボタンを機能させます。

Sourceボタンを押すと、RStudiosource('myfile.r', encoding = 'UTF-8'))を実行するため、sourceをオーバーライドするとエラーが消え、コードが期待どおりに実行されます。

source <- function(f, encoding = 'UTF-8') {
    l <- readLines(f, encoding=encoding)
    eval(parse(text=l),envir=.GlobalEnv)
}
0
Domi