以下は、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
これについては以前の投稿へのコメントでよく話しましたが、コメントの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」をインストールする必要があるため、中国語ではこれができません。同じですが、ロケールを「中国語」に置き換えるだけです(命名が少し矛盾しています。ドキュメントを参照してください)。
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などは実行できません。
問題は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には難しすぎるようです。
ロケールはここでは無関係のようです。それは単なるファイルです。ファイルのエンコーディングを教えてください。なぜロケールが重要なのでしょうか?
私(Windows)の場合:
source.utf8 <- function(f) {
l <- readLines(f, encoding="UTF-8")
eval(parse(text=l),envir=.GlobalEnv)
}
正常に動作します。
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」を使用しましたが、もっとたくさんあると確信しています。
いくつかの漢字を含む.Rファイルを入手しようとすると、この問題が発生します。私の場合、「LC_CTYPE」を「chinese」に設定するだけでは不十分であることがわかりました。ただし、「LC_ALL」を「chinese」に設定するとうまく機能します。
Rstudio(またはR?)で非ASCIIを使用してプレーンテキストファイルを読み書きする場合、エンコードを取得するだけでは不十分であることに注意してください。ロケール設定もカウントされます。
PS。コマンドはSys.setlocale(category = "LC_CTYPE"、locale = "chinese")です。それに応じてロケール値を置き換えてください。
crow's answer に基づいて、このソリューションはRStudio
のSource
ボタンを機能させます。
Source
ボタンを押すと、RStudio
がsource('myfile.r', encoding = 'UTF-8')
)を実行するため、source
をオーバーライドするとエラーが消え、コードが期待どおりに実行されます。
source <- function(f, encoding = 'UTF-8') {
l <- readLines(f, encoding=encoding)
eval(parse(text=l),envir=.GlobalEnv)
}