2016-12-03 10 views
9

Tôi đã gặp phải một hành vi kỳ lạ là c() với R 3.3.2 trên Windows với ngôn ngữ không phải là người Mỹ-Anh. Nó chuyển đổi tên của vectơ được đặt tên thành UTF-8.R - c() bất ngờ chuyển đổi tên của vectơ được đặt tên thành UTF-8. Đây có phải là một lỗi?

x <- "φ" 
names(x) <- "φ" 

Encoding(names(x)) 
#> [1] "unknown" 

Encoding(names(c(x))) 
#> [1] "UTF-8" 

tưởng vấn đề này không phải là vấn đề đối với hầu hết mọi người, nó là rất quan trọng đối với những người sử dụng có tên là vectơ như bảng tra cứu (ví dụ là ở đây: http://adv-r.had.co.nz/Subsetting.html#applications). Tôi cũng là người bị kẹt với the behavior of dplyr's select() function.

Tôi không hoàn toàn chắc chắn liệu hành vi này có phải là lỗi hay do thiết kế hay không. Tôi có nên gửi báo cáo lỗi cho lõi R không?

Dưới đây là thông tin về môi trường R của tôi:

sessionInfo() 
#> R version 3.3.2 (2016-10-31) 
#> Platform: x86_64-w64-mingw32/x64 (64-bit) 
#> Running under: Windows >= 8 x64 (build 9200) 
#> 
#> locale: 
#> [1] LC_COLLATE=Japanese_Japan.932 LC_CTYPE=Japanese_Japan.932 LC_MONETARY=Japanese_Japan.932 
#> [4] LC_NUMERIC=C     LC_TIME=Japanese_Japan.932  
#> 
#> attached base packages: 
#> [1] stats  graphics grDevices utils  datasets methods base  
#> 
#> loaded via a namespace (and not attached): 
#> [1] tools_3.3.2 
+0

Tôi cũng đang sử dụng 3.3.2, đầu ra của hai cuộc gọi Mã hóa giống nhau 'UTF-8' trên PC của tôi. – mt1022

+0

@ mt1022 Cảm ơn bạn đã xác nhận. Tôi đoán vấn đề này chỉ xảy ra trên Windows. Bạn đang sử dụng Windows PC? – yutannihilation

+0

No. Tôi đang sử dụng máy mac. – mt1022

Trả lời

2

Bạn vẫn sẽ thấy names(c(x)) == names(x) trên hệ thống của bạn. Thay đổi mã hóa theo c() có thể không chủ ý, nhưng không ảnh hưởng đến mã của bạn trong hầu hết các trường hợp.

Trên Windows không có ngôn ngữ UTF-8, đặt cược an toàn nhất là chuyển đổi tất cả chuỗi thành UTF-8 trước qua enc2utf8() và sau đó ở lại UTF-8. Điều này cũng sẽ cho phép tra cứu an toàn.

Language symbols (như được sử dụng trong dplyr's group_by()) là một vấn đề hoàn toàn khác. Đối với một số lý do họ luôn luôn được giải thích trong mã hóa bản địa. (Hãy thử as.name(names(c(x))).) Tuy nhiên, vẫn tốt nhất để có chúng trong UTF-8, và chuyển đổi thành bản địa ngay trước khi gọi as.name(). Đây là những gì dplyr nên được thực hiện, chúng tôi chỉ không hoàn toàn có được nêu ra.

Đề xuất của tôi là sử dụng ký tự chỉ ASCII cho tên cột khi sử dụng dplyr trên Windows. Điều này đòi hỏi một số kỷ luật nếu bạn đang dựa vào tidyr::spread() cho nội dung cột không phải ASCII. Bạn cũng có thể xem xét việc chuyển sang một hệ thống (OS X hoặc Linux) hoạt động với UTF-8 nguyên bản.

+0

Cảm ơn! Tôi biết tôi sẽ không gặp phải bất kỳ vấn đề nào trong hầu hết các trường hợp vì R tôn trọng UTF-8 như được mô tả [ở đây] (http://stat.ethz.ch/R-manual/R-devel/library/base/html/Encoding. html). Trường hợp duy nhất tôi biết là 'group_by()' và 'distinct()' của dplyr. Dù sao, đề xuất của bạn có vẻ đúng và rất hợp lý với tôi. Cảm ơn. – yutannihilation

Các vấn đề liên quan