R中list.files()误将文件夹识别为.r文件的原因咨询
为什么归档文件夹会被
list.files(pattern="*.R", ignore.case=TRUE)匹配到? 哈哈,这个问题我之前也踩过一模一样的坑!核心原因是你把list.files()的pattern参数当成了普通的文件通配符(比如我们在文件管理器里用的*.R),但实际上它接受的是正则表达式,两者的匹配规则完全不同!
问题根源:混淆了Glob通配符与正则表达式
你以为pattern="*.R"是“匹配所有以.R结尾的文件”,但在正则语法里:
*是量词,表示“匹配前面的元素0次或多次”,不是“任意字符”.是通配符,表示“匹配任意单个字符”
所以你写的"*.R"这个正则,实际含义是“匹配包含R(忽略大小写时包含r)的任意字符串”——这就解释了为什么开启ignore.case=TRUE后,名字里带r/R的归档文件夹会被匹配进来!
正确的写法:精准匹配.R/.r后缀的文件(排除文件夹)
要准确拿到所有.R和.r后缀的脚本,同时排除文件夹,有两种简单的方法:
方法1:直接写正则表达式
list.files( path = "你的Dropbox文件夹路径", pattern = "\\.[Rr]$", # 匹配以.R或.r结尾的字符串 include.dirs = FALSE # 明确排除文件夹,默认也是FALSE,但写出来更清晰 )
这里的正则\\.[Rr]$拆解一下:
\\.:转义后的点,匹配文件名里的字面量.[Rr]:匹配R或r字符$:匹配字符串的结尾,确保是文件后缀而不是文件名中间的字符
方法2:用glob2rx()转换你熟悉的Glob通配符
如果你更习惯*.R这种写法,可以用glob2rx()把它转换成正则表达式:
list.files( path = "你的Dropbox文件夹路径", pattern = glob2rx("*.R"), # 把glob转成正则:^.*\\.R$ ignore.case = TRUE, include.dirs = FALSE )
glob2rx("*.R")会生成正则"^.*\\.R$",意思是“从开头到结尾,任意字符,最后是.R”,加上ignore.case=TRUE就会同时匹配.r后缀。
补充:为什么原写法能匹配到.R文件?
你之前用pattern="*.R"能拿到4个.R后缀的文件,其实是巧合——因为这些文件名的结尾是.R,包含了R字符,刚好被这个不精准的正则匹配到了。但一旦开启忽略大小写,任何名字里带r的文件夹(比如你的归档文件夹叫old_r_scripts)都会被误匹配。
内容的提问来源于stack exchange,提问作者Rookatu
相关产品推荐
相关产品推荐

