为什么这段代码: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)).现在认为这不是一种好的编码方式,但输出的不一致会导致很多混乱和浪费时间.
这不仅是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给出粗体警告
Run Code Online (Sandbox Code Playgroud)*** 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.
更新:包括Unicode字符时,我似乎重现了该问题。问题可以追溯到sort-在示例中尝试对向量进行排序。我似乎无法将语言环境(LC_COLLATE或LC_CTYPE)更改为"en_AU.UTF-8"任何一个,这将是一个潜在的解决方案。
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |