You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言求助:如何筛选包含特定字符的字符串向量列表?

解决R中context函数报错的列表筛选问题

我有一个字符串向量列表strophlist,想要用它运行以下代码:

for(i in 1:length(strophlist)){
  strophlist[[i]] |> as.vector() |> context(open="(", close=")") -> melislist[[i]]
}

尝试用lapply替代循环时,出现了argument of length 0错误,确认是部分子向量不符合context函数的运行条件,需要移除这些无效向量。但用以下两种方法筛选后都只得到空列表:

strophlist[grep("^\\(.*", strophlist)]
Filter(function(x) all("^\\(.*" %in% x), strophlist)

附strophlist数据:

strophlist <- list(`aus-tiefer-not-1535` = structure(c("2b", "4e", "4b", "4cc", 
"4b", "4g", "4a", "4b", "8r", "8b", "4cc", "4dd", "4cc", "4a", 
"(4g", "4f)", "4e", "2b", "4e", "4b", "4cc", "4b", "4g", "4a", 
"4b", "8r", "8b", "4cc", "4dd", "4cc", "4a", "(4g", "4f)", "4e", 
"8r", "8a", "4g", "4cc", "4b", "8a", "(4dd", "8cc)", "4b", "4a", 
"8r", "8cc", "4b", "4cc", "4dd", "4g", "8Lb", "8Jcc", "4a", "4g", 
"8r", "8g", "4cc", "4b", "4a", "4e", "(4g", "4f)", "1e"), visible = TRUE), 
    `Christ-lag-in-todesbanden-1524` = structure(c("2a", "4g", 
    "4a", "4cc", "4dd", "(4cc", "4b)", "4a", "4r", "4a", "4f", 
    "4g", "4a", "8Lg", "8Jf", "4e", "2d", "2a", "4g", "4a", "4cc", 
    "4dd", "(4cc", "4b)", "4a", "4r", "4a", "4f", "4g", "4a", 
    "8Lg", "8Jf", "4e", "2d", "4r", "4d", "4f", "4g", "4f", "4g", 
    "4a", "8r", "8a", "4dd", "4cc", "(4dd", "4ee)", "4cc", "4b", 
    "4a", "8r", "4a", "4cc", "4a", "4cc", "4g", "(8Lf", "8Jd", 
    "4e)", "4d", "4a", "8Lg", "8Jf", "4e", "1d"), visible = TRUE), 
    `ein-feste-burg-1535` = structure(c("2r", "4r", "4ff", "2ff", 
    "2ff", "2cc", "4dd", "(2ff", "4ee)", "2dd", "2cc", "4r", 
    "4ff", "2ee", "2dd", "2cc", "4dd", "(2b-", "4a", "2g)", "2f", 
    "2r", "4r", "4ff", "2ff", "2ff", "2cc", "4dd", "(2ff", "4ee)", 
    "2dd", "2cc", "4r", "4ff", "2ee", "2dd", "2cc", "4dd", "(2b-", 
    "4a", "2g)", "2f", "4r", "4f", "(4.a", "8b-", "4cc)", "(2dd", 
    "2cc)", "4b", "2cc", "2f", "2cc", "2dd", "2ee", "2ff", "2r", 
    "2ee", "2ff", "2ee", "2dd", "2cc", "2dd", "2dd", "4cc", "2dd", 
    "4cc", "2a", "4r", "4ff", "2ee", "2dd", "2cc", "4dd", "(2b", 
    "4a", "2g)", "0;f"), visible = TRUE), `Erschienen-ist-der-herrlich-tag-1560` = structure(c("4d", 
    "4d", "4d", "2a", "4b", "(4.cc", "8b)", "4a", "2g", "4a", 
    "2b", "4cc", "2dd", "4a", "(4.cc", "16Lb", "16Ja)", "4b", 
    "2a", "4b", "2cc", "4a", "2g", "4f", "(4.a", "8g)", "4f", 
    "2g", "4g", "2cc", "4dd", "2ee", "4dd", "2cc", "4gg", "2ee", 
    "4dd", "(2cc", "2dd)", "4b", "2a"), visible = TRUE), `es-ist-das-heil-uns-kommen-her-1524` = structure(c("4r", 
    "8r", "8dd", "4dd", "4dd", "4dd", "4ff", "4ee", "4dd", "4cc", 
    "8r", "8dd", "4b", "4g", "4b", "4cc", "(4dd", "4ee)", "4dd", 
    "4r", "8r", "8dd", "4dd", "4dd", "4dd", "4ff", "4ee", "4dd", 
    "4cc", "8r", "8dd", "4b", "4g", "4b", "4cc", "(4dd", "4ee)", 
    "4dd", "8r", "8dd", "4.gg", "8.ff", "4ee", "4dd", "4gg", 
    "4ee", "4dd", "8r", "8dd", "4.gg", "8cc", "4dd", "4g", "4b", 
    "4dd", "4b", "8r", "8g", "4a", "4cc", "4b", "4a", "(4e", 
    "4a)", "1;g"), visible = TRUE), `lobt-gott-ihr-christen-alle-gleich-1554` = structure(c("2r", 
    "4r", "4f", "4cc", "4cc", "4cc", "4cc", "4ee", "8Lcc", "8Jb-", 
    "4a", "4a", "4b-", "4cc", "4dd", "4dd", "2cc", "4r", "4cc", 
    "4cc", "4cc", "4cc", "4a", "4cc", "8Lb-", "8Ja", "4g", "4cc", 
    "4a", "8Lg", "8Jf", "4g", "4g", "2f", "2a", "2cc", "8Lb-", 
    "8Ja", "4g", "4g", "1f"), visible = TRUE), `Nun-komm-der-heiden-heiland-1524` = structure(c("4g", 
    "4g", "4f", "4b-", "8aL", "8gJ", "4a", "2g", "4g", "4b-", 
    "4.cc", "8b-", "4cc", "4dd", "2b-", "4b-", "4cc", "4dd", 
    "4b-", "4cc", "8Lb-", "8Ja", "2g", "4g", "4g", "4f", "4b-", 
    "8La", "8Jg", "4a", "0g"), visible = TRUE), `nun-lob-mein-seel-den-herrn-1530` = structure(c("2r", 
    "2r", "2g", "1b-", "2a", "1g", "2f", "(1b-", "2cc)", "1dd", 
    "2dd", "1dd", "2dd", "1dd", "2cc", "1b-", "2a", "1b-", "2r", 
    "2r", "2g", "1b-", "2a", "1g", "2f", "(1b-", "2cc)", "1dd", 
    "2dd", "1dd", "2dd", "1dd", "2cc", "1b-", "2a", "1b-", "2r", 
    "2r", "2b-", "1b-", "2dd", "1cc", "2dd", "(2b-", "1a)", "1g", 
    "2g", "1cc", "2cc", "(1cc", "2a", "2b-)", "1g", "1f", "2r", 
    "2r", "2f", "1b-", "2b-", "1cc", "2cc", "1dd", "1b-", "2b-", 
    "1ee", "2ee", "1dd", "2dd", "1cc", "2r", "2r", "2cc", "1dd", 
    "2dd", "1ee-", "2ee", "1ff", "1b-", "2dd", "1cc", "2f", "2a", 
    "1g", "1f", "2r", "2f", "1b-", "2b-", "1a", "2g", "1cc", 
    "1cc", "2dd", "1ee-", "2dd", "(2.b-", "4a", "4b-", "4cc)", 
    "1cc", "0b-"), visible = TRUE), `vom-himmel-hoch-da-komm-1539` = structure(c("4r", 
    "8r", "8f", "4cc", "4cc", "4dd", "4cc", "4a", "8Lb-", "8Jg", 
    "8r", "8f", "4cc", "4cc", "4cc", "8aL", "8Jb-", "8Lcc", "16b-", 
    "16Ja", "4g", "4f", "8r", "8f", "4f", "4g", "4a", "4a", "4f", 
    "4g", "4a", "8r", "8f", "4cc", "4cc", "4cc", "8La", "8Jb-", 
    "8Lcc", "16b-", "16Ja", "4g", "1f"), visible = TRUE), `wach-auf-deutsches-land-16jhd` = structure(c("1f", 
    "2a", "2b-", "2cc", "2cc", "2dd", "2dd", "1cc", "2r", "2cc", 
    "2dd", "2ee", "2ff", "2ff", "(2ee", "4dd", "4cc", "1ee)", 
    "1cc", "1f", "2a", "2b-", "2cc", "2cc", "2dd", "2dd", "1cc", 
    "2r", "2cc", "2dd", "2ee", "2ff", "2ff", "(2ee", "4dd", "4cc", 
    "1ee)", "1cc", "2r", "2cc", "1ff", "1cc", "1.ff", "2ee", 
    "(2.dd", "4cc", "2b-)", "2b-", "1a", "2r", "2a", "1cc", "2cc", 
    "1dd", "2cc", "2dd", "2ee", "1ff", "2r", "2ff", "1ff", "2cc", 
    "2dd", "2a", "(2.cc", "4b-", "2a", "4g", "4f", "1g)", "0f"
    ), visible = TRUE))

问题分析

之前的筛选方法无效的原因:

  1. strophlist[grep("^\\(.*", strophlist)]:grep直接作用于列表时,会把整个列表转换为字符形式(比如变成"c(\"2b\", \"4e\", ...)"这样的字符串),而不是检查每个子向量中的元素,自然匹配不到目标内容。
  2. Filter(function(x) all("^\\(.*" %in% x), strophlist):这里有两个错误,一是%in%是精确字符串匹配,不支持正则表达式;二是all()要求子向量中所有元素都符合规则,但你的数据里只有部分元素带括号,不符合实际需求。

解决方案

方案1:直接测试函数运行有效性

用tryCatch捕获错误,保留能让context函数正常运行的子向量:

# 筛选可正常运行context的列表元素
filtered_strophlist <- Filter(function(x) {
  success <- tryCatch({
    x |> as.vector() |> context(open="(", close=")")
    TRUE
  }, error = function(e) FALSE)
  success
}, strophlist)

方案2:提前检查括号配对情况

如果context函数需要子向量中存在配对的括号,可以先检查每个子向量是否包含至少一个左括号和右括号:

# 筛选包含至少一个(和)的子向量
filtered_strophlist <- Filter(function(x) {
  has_open <- any(grepl("\\(", x))
  has_close <- any(grepl("\\)", x))
  has_open && has_close
}, strophlist)

验证使用

筛选完成后,用lapply运行目标代码即可:

melislist <- lapply(filtered_strophlist, function(x) {
  x |> as.vector() |> context(open="(", close=")")
})

内容的提问来源于stack exchange,提问作者IMIAD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 12:30:55