R: как убедиться, что R CMD BATCH не производит символы не ASCII? - PullRequest
0 голосов
/ 17 января 2019

В разделе пакета tests я обычно запускаю R CMD BATCH для некоторых файлов xxx.R, что создает xxx.Rout.save. Проблема в том, что неудачный all.equal() создаст символы не ASCII. Это приводит к ошибкам при запуске R CMD check позже:

Сравнение "xxx.sim.Rout" с "xxx.sim.Rout.save"

- "Компонент \" short.run \ ": средняя относительная разница: 0,2180449"

- "Компонент 'short.run': средняя относительная разница: 0,2180449"

Это связано с тем, что all.equal() создает символы не-ASCII:

> tools::showNonASCII(all.equal(list(a=1), list(a=2)))
Component <e2><80><9c>a<e2><80><9d>: Mean relative difference: 1

И, похоже, R CMD check выполняет сценарии xxx.R с параметрами, отличными от тех, которые я использовал при запуске R CMD BATCH ... Обратите внимание, что в руководстве по расширению R написано:

Обратите внимание, что сравнение будет сделано в локали конечного пользователя, поэтому целевые выходные файлы должны быть ASCII, если это вообще возможно.

Но не ясно, как убедиться, что R CMD BATCH создает вывод в ASCII? Я пытался, R CMD BATCH --encoding=ASCII, но он все еще создает файл с не-ASCII!?

cat("all.equal(list(a=1), list(a=2))", file ="xxx.R")
system("R CMD BATCH --encoding=ASCII xxx.R xxx.Rout")
tools::showNonASCIIfile("xxx.Rout")
file.remove(c("xxx.R", "xxx.Rout"))

даёт действительно:

"Компонент <80> <9c> a <80> <9d>: средняя относительная разница: 1"

1 Ответ

0 голосов
/ 19 января 2019

Одним из способов избежать этой проблемы является изменение кавычек в all.equal(). Оказывается, all.equal() использует dQuote () для кавычек, используя причудливые кавычки или нет, в зависимости от options()$useFancyQuotes.

Самый простой - это отключить его (который по умолчанию отключен в Windows):

options(useFancyQuotes=FALSE)

На самом деле, использование TRUE по умолчанию просто вызывает проблемы, см. Документацию:

Выбор соответствующих кавычек зависит как от локаль и доступные наборы символов. Старые шрифты Unix / X11 отображается серьезный акцент (код ASCII 0x60) и апостроф (0x27) таким образом, что они также могут быть использованы в качестве соответствия открытия и закрытия одинарные кавычки. Используя современные шрифты или не-Unix системы, эти символы больше не производят соответствующие глифы. Юникод обеспечивает левый и правые одинарные кавычки (U + 2018 и U + 2019); если Unicode-разметка не может считаться доступной, это кажется хорошим практиковать использование апострофа как ненаправленной одиночной цитаты знак.

...