【问题标题】:Error 'invalid regular expression '[:alpha:]+'' after migrating R and RStudio迁移 R 和 RStudio 后出现错误“无效的正则表达式 '[:alpha:]+''
【发布时间】:2021-09-28 03:18:16
【问题描述】:

在迁移到新 PC 并安装 RStudio 1.4.1717 后,我无法运行在 RStudio 1.3.959 下编写的代码。通过 base R (4.1.0) 运行代码时会出现同样的错误。使用基本 R 函数(grep、gregexpr,例如 gregexpr("[:alpha:]+", "1234a"))时,没有错误消息。

代码:

library(tidyverse)

data_files <- as.data.frame(list.files(data_folder)) 

data_files <- data_files %>%
  mutate(temp = data_files[,1]) %>%
  separate("temp",
           c("temp", "Trash"),
           sep = "\\.") %>%
  select(-"Trash") %>%
  separate("temp",
           c("run", "Trash"),
           sep = "[:alpha:]+", 
           remove = FALSE) %>%
  select(-"Trash") %>%
  separate("temp",
           c("Trash", "letters"),
           sep = "[:digit:]+") %>%
  select(-"Trash") %>%
  select("run", "letters") 

我的 data_folder 包含具有名称模式的 csv 文件(date-increment-letter.csv,例如 21021202a.csv)

错误信息:

Error in gregexpr(pattern, x, perl = TRUE) : 
  invalid regular expression '[:alpha:]+'
In addition: Warning message:
In gregexpr(pattern, x, perl = TRUE) : PCRE pattern compilation error
    'POSIX named classes are supported only within a class'
    at '[:alpha:]+'

使用 dput 的可重现示例:

data_files <- as.data.frame(list.files(icpms_folder))  
dput(head(data_files)) 

structure(list(list.files(icpms_folder) = c("21021202a.csv", 
                                            "21021202b.csv", 
                                            "21021202c.csv", 
                                            "21021203a.csv", 
                                            "21021203b.csv", 
                                            "21021203c.csv")), 
                 row.names = c(NA, 6L), class = "data.frame")

请您指出我的全新安装中缺少什么?

提前谢谢你!

【问题讨论】:

  • 请分享reproducible example,包括您使用的数据的一个小例子,最好使用dput(head(YOURDATA))。编辑您的问题并将structure(...)-output 放在那里。
  • 最后:尝试将sep = "[:alpha:]+" 替换为sep = "[[:alpha:]]+"
  • @MartinGal,我相信这就是答案,请发布?我不知道为什么这以前会起作用(也许不是真的?)
  • @BenBolker 一些正则表达式专家应该发布这个并给出适当的解释,我实际上无法给出。
  • @MartinGal:这部分代码完成得非常快,没有经过深思熟虑。它工作了数百甚至数千次来获取文件列表,然后我将其传递给我的函数以实际读取数据。您将sep = "[:alpha:]+" 替换为sep = "[[:alpha:]]+" 的解决方案非常有效,谢谢!我不知道为什么第一个变体适用于我之前的安装。

标签: r regex


【解决方案1】:

“为什么”的答案已在错误消息中:POSIX 命名类仅在类中受支持

POSIX named classes 类似于[:digit:][:alpha:] 等等。

通过“class”,消息作者的意思是character class,即[...]

把一个放在另一个里面:

sep = '[[:alpha:]]+'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多