2014-09-07 5 views
2

У меня есть таблица данных, в которой некоторые поля копируются и вставляются из текстовых документов. При попытке вывода xtable гравюр из RMarkdown, то получите эту ошибку:print xtable gsub locale problems

Error in gsub("&", "&", result, fixed = TRUE) : 
    input string 3 is invalid in this locale 
Calls: <Anonymous> ... eval -> eval -> print -> print.xtable -> sanitize -> gsub 
Execution halted 

Вот воспроизводимый пример. Я назвал это dataframe test4:

library(xtable) 
test4 <- structure(list(Record.ID = 81, Record.Type = "Type1", Short.Description = "specify 2-8\xb0C storage location",Record.State = "Work in Progress", Owner = "person1", Due.Date = "2014-08-14",days.left = -24), row.names = c(NA, -1L), .Names = c("Record.ID","Record.Type","Short.Description", "Record.State", "Owner","Due.Date", "days.left"), class = "data.frame") 
print(xtable(test4,display=c("d","d","s","s","s","s","s","d")),include.rownames=F,floating=F,type="html") 

Как я могу получить xtable напечатать, даже если я буду иметь странные символы, как это?

FYI, эта же операция работает без ошибок, когда я запускаю ее на окнах. На debian linux я получаю сообщение об ошибке. Также я проверил свой язык, и он настроен правильно.

ответ

3

Ну, если вы копируете данные из Windows, кодировка, скорее всего, «latin1». Я предполагаю, что кодировка по умолчанию для debian linux - это «UTF-8». Теперь, когда вы говорите, что копируете данные, мне не совсем ясно, как вы получаете это в R, но похоже, что байты не преобразуются в правильную кодировку.

Учитывая ваш пример data.frame, вы можете «исправить» ошибку, указав в явном виде о кодировании поля «Short.Description» (что и вызывает ошибку в этом случае). Попробуйте

Encoding(test4$Short.Description) <- "latin1" 

Затем, если вы запустите print() снова, вы должны получить что-то вроде этого.

<!-- html table generated in R 3.1.0 by xtable 1.7-3 package --> 
<!-- Sun Sep 7 13:33:56 2014 --> 
<TABLE border=1> 
<TR> <TH> Record.ID </TH> <TH> Record.Type </TH> <TH> Short.Description </TH> 
<TH> Record.State </TH> <TH> Owner </TH> <TH> Due.Date </TH> 
<TH> days.left </TH> </TR> 
<TR> <TD align="right"> 81 </TD> <TD> Type1 </TD> 
<TD> specify 2-8°C storage location </TD> 
<TD> Work in Progress </TD> <TD> person1 </TD> <TD> 2014-08-14 </TD> 
<TD align="right"> -24 </TD> </TR> </TABLE> 
+0

Большое вам спасибо. Это было именно это. Исходные данные сохранялись в excel на окнах, а символьные строки были закодированы в любом excel, указанном. Когда я импортировал этот csv на linux, кодирование было догадаться неправильно. Поговорив с MrFlick, он предложил указать кодировку символов, когда я импортирую свои данные с помощью read.csv ("csvname.csv", stringsAsFactors = F, ** fileEncoding = "latin1" **), и это отлично пошло. Благодаря! – variable