2015-03-25 13 views
14

Wprowadziłem ciąg tekstowy w pliku .csv, który zawiera symbole Unicode jako: \U00B5 g/dL. W .csv pliku, oraz w ramce odczytu danych R:Drukuj ciąg znaków Unicode w R

enter image description here

test=read.csv("test.csv") 

enter image description here

\U00B5 przyniosłoby MICRO steru- jj. R odczytuje go w pliku danych takim, jaki jest (\U00B5). Jednak gdy wydrukuję ciąg, będzie on wyświetlany jako \\U00B5 g/dL.
Alternatywnie, ręczne wprowadzenie kodu działa poprawnie.

varname <- c("a", "b", "c") 
labels <- c("A \U00B5 g/dL", "B \U00B5 g/dL", "C \U00B5 g/dL") 
df <- data.frame(varname, labels) 
test <- data.frame(varname, labels) 
test 
# varname labels 
# 1  a A µ g/dL 
# 2  b B µ g/dL 
# 3  c C µ g/dL 

Zastanawiam się jak mogę pozbyć się znaku ucieczki \ w tej sprawie i mieć go wydrukować symbol. Lub, jeśli istnieje inny sposób wydrukowania symbolu w R.

Dziękuję bardzo za pomoc!

+0

Kiedy mówisz * Jednak podczas drukowania ciąg to pokazuje jak '\\ U00B5 g/dL'. *, dokąd drukowania ciąg? –

+0

Dzięki Richard, wydrukuję go w konsoli R. – outboundbird

+1

Wydaje mi się, że problem polega mniej na poprawnym drukowaniu znaku Unicode, niż na poprawnym odczytywaniu literalnego tekstu Unicode z pliku i interpretowaniu go jako ciąg znaków Unicode. –

Odpowiedz

27

Cóż, najpierw zrozum, że niektóre znaki w R muszą zostać zmienione, jeśli znajdują się poza standardowymi znakami ASCII. Zazwyczaj robi się to za pomocą znaku "\". Dlatego trzeba uciec z tego znaku, gdy piszesz ciąg w R

a <- "\" # error 
a <- "\\" # ok. 

„\ U” to specjalny wskaźnik do ucieczki Unicode. Zauważ, że nie ma ukośników ani liter U w ciągu znaków, gdy używasz tego polecenia. To tylko skrót do określonej postaci. Uwaga:

a <- "\U00B5" 
cat(a) 
# µ 
grep("U",a) 
# integer(0) 
nchar(a) 
# [1] 1 

To jest zupełnie inna niż w ciągu

a <- "\\U00B5" 
cat(a) 
# \U00B5 
grep("U",a) 
# [1] 1 
nchar(a) 
# [1] 6 

Normalnie podczas importowania pliku tekstowego, należy zakodować charakter non-ASCII w cokolwiek kodowanie jest używane przez plik (UTF-8, lub Latin-1 są najczęstsze). Mają specjalne bajty do reprezentowania tych znaków. To nie jest "normalne", gdy plik tekstowy ma sekwencję escape ASCII dla znaków Unicode. Właśnie dlatego R nie próbuje przekonwertować "\ U00B5" na znak Unicode, ponieważ zakłada, że ​​gdybyś chciał mieć znak Unicode, po prostu użyłbyś go bezpośrednio.

Najprostszym sposobem ponownego zinterpretowania wartości znaków ASCII będzie użycie pakietu stringi. Dla exampel

library(stringi) 
a <- "\\U00B5" 
stri_unescape_unicode(gsub("\\U","\\u",a, fixed=TRUE)) 

(jedyny haczyk jest, że trzeba konwertować „\ U” do bardziej powszechne „\ u” tak funkcja prawidłowo rozpoznawane ucieczkę). Można to zrobić na importowanych danych z

test$label <- stri_unescape_unicode(gsub("\\U","\\u",test$label, fixed=TRUE)) 
Powiązane problemy