以下,当直接复制并粘贴到R中时可以正常工作:
> character_test <- function() print("R同时也被称为GNU S是一个强烈的功能性语言和环境,探索统计数据集,使许多从自定义数据图形显示...")
> character_test()
[1] "R同时也被称为GNU S是一个强烈的功能性语言和环境,探索统计数据集,使许多从自定义数据图形显示..."
但是,如果我创建一个名为character_test.R的文件,其中包含EXACT SAME代码,请将其保存为UTF-8编码(以便保留特殊的中文字符),然后当我在R中使用source()时,我收到以下错误:
> 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-console的两个输入(请参阅屏幕截图)评论)以及来自文件的输入请看这个截图:
文件“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”,但是这个过程是一样的,你只需用“chinese”替换语言环境(命名有点不一致,请查阅文档)。
在R / Windows上,source
遇到任何UTF-8字符的问题,这些字符无法在当前语言环境中表示(或者说Windows语言中的ANSI代码页)。不幸的是,Windows没有UTF-8作为ANSI代码页 - 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来说似乎太难了。
Locale似乎与此无关。它只是一个文件,你告诉它文件的编码是什么,为什么你的语言环境很重要?
对我(在窗户上)我这样做:
source.utf8 <- function(f) {
l <- readLines(f, encoding="UTF-8")
eval(parse(text=l),envir=.GlobalEnv)
}
它工作正常。
在Windows上,当您将unicode或utf-8编码的字符串复制粘贴到设置为单字节输入的文本控件(ascii ...取决于区域设置)时,未知字节将被问号替换。如果我取你的字符串的前4个字符并将其复制粘贴到例如记事本然后保存它,文件变为十六进制:
令人惊讶的是
你需要做的是找到一个编辑器,你可以在将文本复制粘贴到其中之前设置为utf-8,然后保存的文件(前4个字符)变为:
52 E5 90 8 E ss Bs Eq Bai FF E8 A2 AB
然后通过[R]将其识别为有效的utf-8。
我用“Notepad2”来试试这个,但我相信还有更多。
尝试获取包含一些中文字符的.R文件时遇到此问题。就我而言,我发现仅将“LC_CTYPE”设置为“中文”是不够的。但将“LC_ALL”设置为“中文”效果很好。
请注意,当您使用非ASCII读取或写入Rstudio(或R?)中的纯文本文件时,仅使编码正确是不够的。区域设置也很重要。
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)
}