为什么unicode字符串上的as.factor()会为每个操作系统返回不同的结果?

Mil*_*ain 8 unicode r

为什么这段代码:as.factor(c("\U201C", '"3', "1", "2", "\U00B5"))在每个操作系统上返回不同的因子级别排序?

在Linux上:

> as.factor(c("\U201C",'"3', "1", "2","\U00B5")) [1] " "3 1 2 µ Levels: µ " 1 2 "3

在Windows上:

> as.factor(c("\U201C",'"3', "1", "2","\U00B5")) [1] " "3 1 2 µ Levels: "3 " µ 1 2

在Mac OS上:

>as.factor(c("\U201C",'"3', "1", "2","\U00B5")) [1] " "3 1 2 µ Levels: "3 " 1 2 µ

我让一些学生提交了包含的RMardkown作业as.numeric(as.factor(dat$var)).现在认为这不是一种好的编码方式,但输出的不一致会导致很多混乱和浪费时间.

Jon*_*oll 5

这不仅是Unicode,还不仅仅是R;sort通常(甚至在* nix命令中sort)可以是特定于语言环境的。要消除差异,需要在所有机器上通过(按@alistaire的评论)设置LC_COLLATE(大概为"C"Sys.setlocale

对我而言,在Windows(7)上:

sort(c("Abc", "abc", "_abc", "ABC"))
[1] "_abc" "abc"  "Abc"  "ABC" 
Run Code Online (Sandbox Code Playgroud)

而在Linux(Ubuntu 12.04 ...哇,我需要升级该机器)上

sort(c("Abc", "abc", "_abc", "ABC"))
[1] "abc"  "_abc" "Abc"  "ABC" 
Run Code Online (Sandbox Code Playgroud)

通过上述方式设置语言环境

Sys.setlocale("LC_COLLATE", "C")
Run Code Online (Sandbox Code Playgroud)

sort(c("Abc", "abc", "_abc", "ABC"))
[1] "ABC"  "Abc"  "_abc" "abc" 
Run Code Online (Sandbox Code Playgroud)

在两台机器上都一样。

* nix man页面用于sort给出粗体警告

   *** WARNING *** The locale specified by the  environment  affects  sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.
Run Code Online (Sandbox Code Playgroud)

更新:包括Unicode字符时,我似乎重现了该问题。问题可以追溯到sort-在示例中尝试对向量进行排序。我似乎无法将语言环境(LC_COLLATELC_CTYPE)更改为"en_AU.UTF-8"任何一个,这将是一个潜在的解决方案。