- 已编辑
前两天更新R 4.3之后,发现使用dir函数获取文件列表的时候会有文件获取不了,这是怎么回事?
又下载了4.2的版本,发现确实是版本的原因
前两天更新R 4.3之后,发现使用dir函数获取文件列表的时候会有文件获取不了,这是怎么回事?
又下载了4.2的版本,发现确实是版本的原因
在 Linux 上不能复现,会不会是 locale 的问题?
touch 一 二二 三三三 四四四四 a bb ccc dddd; R -e 'dir()'
> dir()
[1] "a" "bb" "ccc" "dddd" "一" "三三三" "二二"
[8] "四四四四"
我的系统信息:
+> sessionInfo()
R version 4.3.0 (2023-04-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Arch Linux
Matrix products: default
BLAS: /usr/lib/libblas.so.3.11.0
LAPACK: /usr/lib/liblapack.so.3.11.0
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
time zone: Asia/Hong_Kong
tzcode source: system (glibc)
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_4.3.0
yydhcl sundly 建议向 R 核心团队报告一下,造福广大中文用户:https://stat.ethz.ch/mailman/listinfo/r-devel 这种问题一般是 Tomas Kalibera 负责,他通常比较积极响应。R 核心团队几乎全是英文母语,难以察觉这种中文问题,所以还得靠国人多努力向他们报告。
sundly 你这表达对大神敬仰的话有点戳肺管子
有人向R核心团队报告了吗?希望在下一个R版本能修复。
(1)前段时间遇到这个问题,无法解决,非常痛苦。最后想到了一个临时解决方案,调用cmd里面的dir命令。
dir0 <- function(path) {
path <- normalizePath(path)
. <- shell(sprintf("dir %s", path), shell=Sys.which("cmd"), intern = T)
. <- iconv(., from = "GBK", to = "UTF-8")
a <- grep(" 的目录$", .)
b <- grep(".*个文件 .* 字节", .)
. <- read.table(text = .[(a+2):(b-1)])
. <- .[, 4]
. <- grep("^[.]+$", ., value = T, invert = T)
. <- normalizePath(file.path(path, .))
.
}
(2) nan.xiao 提到的 fs::dir_ls() 。试了下,可以使用。
进一步测试发现:
R 4.3版本中 dir函数无法识别ANSI编码的中文文件。
unlink("测试文件", recursive = T, force = T)
dir.create("测试文件")
cat("", file = "测试文件/测试中文-utf-8.txt")
dir("测试文件", full.names = T)
#> [1] "测试文件/测试中文-utf-8.txt"
fs::dir_ls("测试文件")
#> 测试文件/测试中文-utf-8.txt
手动修改格式:使用记事本打开 “测试文件/测试中文-utf-8.txt”,文件 -> 另存为 -> 选择编码“ANSI” -> 保存,另存为“测试文件/测试中文-ANSI.txt”。
dir("测试文件", full.names = T)
#> character(0)
fs::dir_ls("测试文件")
#> 测试文件/测试中文-ANSI.txt 测试文件/测试中文-utf-8.txt
sessionInfo()
#> R version 4.3.0 (2023-04-21 ucrt)
#> Platform: x86_64-w64-mingw32/x64 (64-bit)
#> Running under: Windows 10 x64 (build 19044)
#>
#> Matrix products: default
#>
#>
#> locale:
#> [1] LC_COLLATE=Chinese (Simplified)_China.utf8
#> [2] LC_CTYPE=Chinese (Simplified)_China.utf8
#> [3] LC_MONETARY=Chinese (Simplified)_China.utf8
#> [4] LC_NUMERIC=C
#> [5] LC_TIME=Chinese (Simplified)_China.utf8
#>
#> time zone: Asia/Shanghai
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> loaded via a namespace (and not attached):
#> [1] digest_0.6.31 fastmap_1.1.1 xfun_0.39 glue_1.6.2
#> [5] knitr_1.42 htmltools_0.5.5 rmarkdown_2.21 lifecycle_1.0.3
#> [9] cli_3.6.1 reprex_2.0.2 withr_2.5.0 compiler_4.3.0
#> [13] rstudioapi_0.14 tools_4.3.0 evaluate_0.21 yaml_2.3.7
#> [17] rlang_1.1.1 fs_1.6.2
怎样向R核心团队报告呢,直接给 r-devel@r-project.org 发送电子邮件吗?
果然是版本的问题,期待尽快解决哈,升级后发现涉及到中文路径的list.files和FTP上传全都失效了。
最新版本的4.3.1版本这个BUG还是没有修复
我之前给 r-devel@r-project.org 发送了电子邮件,报告过。但是没有收到回复。
R 核心团队的Tomas已经制作了一个补丁,Ivan Krylov 请求我测试这个补丁,如果这个issue的报告者或者其他遇到问题的朋友可以测试一下这个并反馈,会对修复这个问题很有帮助。
基于目前我这里有限的测试用例,它测试通过了,但可能还有其他的情况,我不确定其他人是否能帮忙再次检查一下。尤其是发现此类问题的 wangbinzjcc @yydhcl @sundly
可以在此处下载新的R-devel来测试该问题是否修复。https://nightly.link/r-devel/r-svn/suites/5879669057/artifacts/865824886
谢谢。
-Shun Wang
新版本的R-devel 已经可以使用了。喜大普奔呀。不过可能很多用户从来就没有发现过这个问题。
dir("测试文件")
[1] "测试中文-ANSI.txt" "测试中文-utf-8.txt"
连同另外一个一直困扰我很久的问题一起解决了:https://d.cosx.org/d/423306-r42/2
简直是福音呀!!
read.csv("测试文件/测试ansi.csv")
中文 中文2
1 中文 中文
2 中文 中文
3 中文 中文
read.csv("测试文件/测试utf8.csv")
中文 中文2
1 中文 中文
2 中文 中文
3 中文 中文
(后来才发现,这个测试结果是错误的。应该测试 utils::read.csv 函数)