Мне нужно было переделать пару картинок к постеру. Соавтор уезжает на
конференцию, постер нужен срочно, плюс у меня ещё куча дел. Ну,
захожу в директорию, меняю параметры, говорю make - и
все вылетает с кучей ошибок.
Пошаговое прохождение показало, что все начинается с того, что
Sweave выдает
замечательное предупреждение:
Warning: '01_preparation.rnw' has unknown encoding: assuming Latin-1
Но исходный файл вовсе не в кодировке Latin-1: он обрабатывает
полученные из России по-русски данные, и в нем есть процедуры
типа
RussianToLevel <- function(x) {
x <- as.character(x)
if (grepl("^нет",x)) return(1)
if (grepl("^чуть",x)) return(2)
if (grepl("^незнач",x)) return(3)
if (grepl("^средн",x)) return(4)
if (grepl("^сильн",x)) return(5)
if (grepl("^очень",x)) return(6)
return(NA)
}
В файле они превратились в такое:
RussianToLevel <- function(x) {
x <- as.character(x)
NA
NA
NA
NA
NA
NA
return(NA)
}
Неудивительно, что на следующем шаге все вылетает.
Ок, вручную понабирал команды R, получил картинки, послал.
Затем стал думать, что же случилось. С момента, когда я делал эти
картинки в прошлый раз, успел обновить R.
Почитал логи программистов.
Замечательная запись:
[CHANGES IN R VERSION 2.13.2:] Sweave now knows about a few more
Windows' encodings (including
cp1250 and cp1257) and some inputenx encodings such as koi8-r.
Это случай так называемого вранья. На самом деле все в точности
наоборот: раньше Sweave знала про эти кодировки, а именно в
версии 2.13.2 перестала их извлекать из файла. Смена
inputenc на inputenx не дала результатов.
Ещё немного экспериментов показало, что если указать кодировку явно,
Sweave милостиво соглашается работать.
В итоге все вылечилось заменой в Makefile строчек
%.tex: %.rnw
R CMD Sweave $<
%.R: %.rnw
R CMD Stangle $<
на строчки
%.tex: %.rnw
echo "Sweave ('$<', encoding='koi8-r')" | R --slave
%.R: %.rnw
echo "Stangle ('$<', encoding='koi8-r')" | R --slave
И на что я, спрашивается, потратил день?!
Програм-м-м-мисты...