前两天更新R 4.3之后,发现使用dir函数获取文件列表的时候会有文件获取不了,这是怎么回事?
图片
又下载了4.2的版本,发现确实是版本的原因
图片

    yydhcl 更改标题为「r4.3版本中dir函数获取不了全部文件
    16 天 后

    yydhcl 我也发现了,超过4个中文字符的纯中文不行,在前面加个英文就可以

      在 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

      sundly 之前被你的各种down包折磨的死去活来!

      想了半天,我是该哭还是该笑呢……

      有人向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() 。试了下,可以使用。

      https://d.cosx.org/d/424433-r430shi-yong-listfilesdu-qu-wen-jian-lie-biao-chao-chu-4ge-zhong-wen-zi-fu-wu-fa-du-qu

        进一步测试发现:
        R 4.3版本中 dir函数无法识别ANSI编码的中文文件。

        R 4.3版本中,dir函数可以识别UTF-8编码的中文文件。

        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”。

        R 4.3版本中,dir函数无法识别ANSI编码的中文文件。

        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

        sundly 哈哈哈,这该死的语言魅力,让人难以抵御。看了眼注册时间,想问是上古大神新近才想起账号密码吗?

        4 天 后

        果然是版本的问题,期待尽快解决哈,升级后发现涉及到中文路径的list.files和FTP上传全都失效了。

          2 个月 后
          13 天 后

          R 核心团队的Tomas已经制作了一个补丁,Ivan Krylov 请求我测试这个补丁,如果这个issue的报告者或者其他遇到问题的朋友可以测试一下这个并反馈,会对修复这个问题很有帮助。
          基于目前我这里有限的测试用例,它测试通过了,但可能还有其他的情况,我不确定其他人是否能帮忙再次检查一下。尤其是发现此类问题的 wangbinzjcc @yydhcl @sundly
          可以在此处下载新的R-devel来测试该问题是否修复。https://nightly.link/r-devel/r-svn/suites/5879669057/artifacts/865824886
          谢谢。
          -Shun Wang

            shunwang

            新版本的R-devel 已经可以使用了。喜大普奔呀。不过可能很多用户从来就没有发现过这个问题。

            dir("测试文件")
            [1] "测试中文-ANSI.txt" "测试中文-utf-8.txt"

              shunwang

              连同另外一个一直困扰我很久的问题一起解决了: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 函数)