¿Cómo se guarda () el archivo .R guardado con la encoding UTF-8?

Lo siguiente, cuando se copia y pega directamente en R funciona bien:

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

Sin embargo, si hago un archivo llamado character_test.R que contenga el código EXACT SAME, guárdelo en encoding UTF-8 (para conservar los caracteres chinos especiales), cuando lo fuente () en R, obtengo el siguiente error :

 > 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' 

Cualquier ayuda que pueda ofrecer para resolver y ayudarme a comprender lo que está sucediendo aquí sería muy apreciada.

 > 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 

y

 > l10n_info() $MBCS [1] FALSE $`UTF-8` [1] FALSE $`Latin-1` [1] TRUE $codepage [1] 1252 

Hablamos mucho de esto en los comentarios a mi publicación anterior, pero no quiero que esto se pierda en la página 3 de comentarios: tiene que establecer la configuración regional, funciona con ambas entradas desde la consola R (ver captura de pantalla en comentarios), así como con la entrada del archivo, vea esta captura de pantalla:

El archivo “myfile.r” contiene:

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

La consola contiene:

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

Tenga en cuenta que el archivo entra falla y apunta al mismo carácter que el error del cartel original (el que está después de "R"). No puedo hacer esto con chino porque tendría que instalar "Microsoft Pinyin IME 3.0", pero el proceso es lo mismo, simplemente reemplaza la configuración regional con "chino" (la denominación es un poco inconsistente, consulta la documentación).

En R / Windows, el source tiene problemas con los caracteres UTF-8 que no se pueden representar en la configuración regional actual (o la página de códigos ANSI en Windows-speak). Desafortunadamente, Windows no tiene UTF-8 disponible como página de códigos ANSI. Windows tiene una limitación técnica de que las páginas de códigos ANSI solo pueden ser codificaciones de uno o dos bytes por caracteres, no codificaciones de bytes variables como UTF. 8.

Esto no parece ser un problema fundamental e irresoluble, simplemente hay algo mal con la función source . Puede obtener el 90% del camino haciendo esto en su lugar:

 eval(parse(filename, encoding="UTF-8")) 

Esto funcionará casi exactamente como source() con argumentos predeterminados, pero no te permitirá hacer echo = T, eval.print = T, etc.

Para mí (en Windows) lo hago:

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

Funciona bien.

Creo que el problema radica en R. Puedo felizmente obtener archivos UTF-8 o UCS-2LE con muchos caracteres que no sean ASCII. Pero algunos personajes hacen que falle. Por ejemplo, el siguiente

 danish < - function() print("Skønt HC 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 ("Американские суда находятся в международных водах. Япония выразила серьезное беспокойство советскими действиями.") 

está bien en UTF-8 y UCS-2LE sin la línea rusa. Pero si eso está incluido, entonces falla. Estoy señalando con el dedo a R. Tu texto chino también parece ser demasiado difícil para R en Windows.

La configuración regional parece irrelevante aquí. Es solo un archivo, usted le dice qué es la encoding del archivo, ¿por qué debería importar su ubicación?

En Windows, al copiar y pegar una cadena codificada en unicode o utf-8 en un control de texto que está configurado en entrada de un solo byte (ascii … dependiendo de la configuración regional), los bytes desconocidos serán reemplazados por questionmarks. Si tomo los primeros 4 caracteres de la cadena y los copio y pego en, por ejemplo, el Bloc de notas y luego los guardo, el archivo se convierte en hexadecimal:

52 3F 3F 3F 3F

lo que tiene que hacer es buscar un editor que pueda configurar para utf-8 antes de copiar y pegar el texto en él, luego el archivo guardado (de sus primeros 4 caracteres) se convierte en:

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

Esto se reconocerá como válido utf-8 por [R].

Usé “Notepad2” para probar esto, pero estoy seguro de que hay muchos más.

Me encuentro con este problema cuando trato de obtener un archivo .R que contenga algunos caracteres chinos. En mi caso, descubrí que simplemente establecer “LC_CTYPE” en “chino” no es suficiente. Pero ajustar “LC_ALL” a “chino” funciona bien.

Tenga en cuenta que no es suficiente obtener la encoding correcta cuando lee o escribe un archivo de texto plano en Rstudio (o R?) Con un código que no sea ASCII. La configuración regional también cuenta.

PD. el comando es Sys.setlocale (category = “LC_CTYPE”, locale = “chinese”). Por favor, reemplace el valor de configuración regional correspondiente.

Basándose en la respuesta de Crow , esta solución hace que el botón Source RStudio funcione.

Al presionar ese botón de Source , RStudio ejecuta la source('myfile.r', encoding = 'UTF-8') ), por lo que anular la source hace que los errores desaparezcan y ejecuta el código como se esperaba:

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