2013-04-10 10 views
7

Używam knitr 1.1. w wersji 3.0.0 iw środowisku WinEdt (RWinEdt 2.0). Mam problem z dzianiną rozpoznającą szwedzkie postacie (ä, ö, å). To nie jest problem z R; znaki te są nawet rozpoznawane w nazwach plików, nazwach katalogów, obiektach itp. W Sweave nie stanowiło to problemu.Non-angielskie znaki specjalne w knitr

Mam już \usepackage[utf8]{inputenc} w moim dokumencie, ale knitr nie wydaje się w stanie obsłużyć znaków specjalnych. Po uruchomieniu programu knitr pojawia się następujący komunikat:

Warning in remind_sweave(if (in.file) input) : 
It seems you are using the Sweave-specific syntax; you may need Sweave2knitr("deskriptiv 130409.Rnw") to convert it to knitr 

processing file: deskriptiv 130409.Rnw 

(*) NOTE: I saw chunk options "label=läser_in_data" 
please go to http://yihui.name/knitr/options (it is likely that you forgot to 
quote "character" options) 

Error in parse(text = str_c("alist(", quote_label(params), ")"), srcfile = NULL) : 
1:15: unexpected input 
1: alist(label=lä 
       ^
Calls: knit ... parse_params -> withCallingHandlers -> eval -> parse 
Execution halted 

Szczególną etykietą, na którą się skarży, jest label = läser. Zmiana etykiety nie wystarczy, ponieważ knitr nawet narzeka, że ​​obiekty R używają äåö.

Użyłem Sweave2knitr(), ponieważ plik pierwotnie został stworzony dla Sweave, ale wynik nie był lepszy: teraz wszystkie äåö zostały przekształcone na äpÃ, ¶, zarówno w fragmentach R, jak iw tekście lateksu, a knitr nadal wyświetla komunikat o błędzie.

informacji Sesja:

R version 3.0.0 (2013-04-03) 
Platform: i386-w64-mingw32/i386 (32-bit) 

locale: 
[1] LC_COLLATE=Swedish_Sweden.1252 LC_CTYPE=Swedish_Sweden.1252   LC_MONETARY=Swedish_Sweden.1252 
[4] LC_NUMERIC=C     LC_TIME=Swedish_Sweden.1252  
attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  
other attached packages: 
[1] knitr_1.1 
loaded via a namespace (and not attached): 
[1] digest_0.6.3 evaluate_0.4.3 formatR_0.7 stringr_0.6.2 tools_3.0.0 

Jak wspomniałem są nazwy plików i przedmiotów z postaciami szwedzkich (ponieważ nie było problemu wcześniej), a także tekst musi być w języku szwedzkim.

Dziękuję za pomoc w zdobyciu dzianin do pracy poza angielskim.

Odpowiedz

3

Myślę, że musisz skontaktować się z opiekunem R-Sweave mode w WinEdt, jeśli używasz tego trybu, aby zadzwonić pod numer knitr. Problem polega na tym, że WinEdt musi przekazać kodowanie pliku do knit(), jeśli nie używasz natywnego kodowania systemu operacyjnego. Wspomniałeś o UTF-8, ale to nie jest natywne kodowanie dla Windows, więc nie możesz używać \usepackage[utf8]{inputenc}, chyba że masz pewność, że twój plik jest zakodowany w UTF8.

Jest tu kilka pomieszanych problemów i jest mało prawdopodobne, aby rozwiązać je wszystkie za pomocą jednej odpowiedzi.

Pierwszym problemem jest label=läser, które naprawdę powinny być label='läser', to znaczy ty must quote wszystkie etykiety chunk (sprawdź inne etykiety w dokumencie, jak również); knitr próbuje automatycznie zacytować twoje etykiety podczas pisania <<foo>>= (jest to zmienione na <<'foo'>>=), ale to nie działa, gdy używasz <<label=foo>>= (musisz napisać jawnie <<label='foo'>>=). Ale ten problem nie jest tutaj konieczny.

Myślę, że prawdziwym problemem jest tutaj kodowanie plików (co jest paskudne w Windowsie). Wygląda na to, że używasz UTF-8 w systemie, który domyślnie nie jest zgodny z UTF-8. W tym przypadku masz połączenie knit('yourfile.Rnw', encoding = 'UTF-8'), tj. Przekazanie kodowania do knit(). Nie używam WinEdt, więc nie mam pojęcia, jak to zrobić. Możesz hard-code the encoding in the configurations, ale nie jest to zalecane.

dwie propozycje:

  1. nie używać UTF-8 pod Windows; zamiast tego użyj systemowego kodowania macierzystego (Windows-1252, chyba);
  2. lub użyj RStudio zamiast WinEdt, które może przekazać kodowanie do knitr;

BTW, ponieważ pojawił się , w twoim dokumencie Rnw muszą być inne problemy. Aby zdiagnozować problem, istnieją dwa sposoby, aby przejść:

  1. jeśli używasz UTF-8, prowadzone Sweave2knitr('deskriptiv 130409.Rnw', encoding = 'UTF-8')
  2. w przypadku korzystania z natywnego kodowania systemu operacyjnego, wystarczy uruchomić Sweave2knitr('deskriptiv 130409.Rnw')

Proszę przeczytać documentation, jeśli masz pytania dotyczące informacji diagnostycznych wydrukowanych przez Sweave2knitr().

+0

Dzięki. Przynajmniej teraz jestem w stanie uruchomić knitr() na moim pliku, ale specjalne znaki nadal stanowią problem. Poprawiłem części Sweave zgodnie z knitr(). Tekst latexowy działa poprawnie, określając (w tej kolejności):
'\ usepackage [utf8] {inputenc}' '\ usepackage [T1] {fontenc}'. – user2266041

+1

@ user2266041 Jeśli masz pewność, że używasz UTF-8, odpowiedź Gilberta powinna działać. –

2

R-Sweave wywołuje knitr poprzez makro knitr.edt, które samo używa kodu w knitrSweave.R, aby uruchomić dzianinę. Komenda knit w tym późniejszym skrypcie znajduje się w górnej części i czyta res <- knit(filename).

Po sugestii Yihui, można spróbować zastąpić tę komendę z

res <- knit(filename, encoding = 'UTF-8') 

knitr.edt i knitrSweave.R pliki powinny być w folderze %b\Contrib\R-Sweave, gdzie %b jest folder użytkownik WinEdt (coś jak "C:\Users\userA\AppData\Roaming\WinEdt Team\WinEdt 7" pod Win 7) .

Obecnie nie wiem, w jaki sposób możemy przekazać kodowanie jako argument, aby uniknąć tego twardego rozwiązania kodowania.

Proponuję unikać znaków rozszerzonych w nazwach plików, które mogą być źródłem problemów. Osobiście nigdy nie używam takich nazwisk.

+0

Gilbert: Dzięki za odpowiedź. Dodałem tekst, o którym wspomniałeś, ale nadal mam problemy z dzierżawieniem specjalnych cech w części R. Nazwy plików i obiekty R zawierające äåö po prostu nie są czytane. – user2266041