一位用户问我如何在How to italicize select words in a ggplot legend?中做到这一点,我对我的变通方法不满意.

其目的是在除给定字符串之外的所有字符向量元素周围添加括号*.让我们假设在这个例子中,这些总是在开头找到的.我对第一组使用可选捕获,然后使用星号包括第二组.当搜索的单词单独存在并且没有后续字符串时,就会出现问题.

我已经在代码中包含了所需的输出和一些try .

v <- head(rownames(mtcars))
## does also not work with (.*)?, nor with (.+) nor (.+)?
gsub("(Hornet |Valiant)?(.*)", "\\1\\*\\2\\*", v) 
#> [1] "*Mazda RX4*"         "*Mazda RX4 Wag*"     "*Datsun 710*"       
#> [4] "Hornet *4 Drive*"    "Hornet *Sportabout*" "Valiant**"

## desired output
ifelse(grepl("Valiant", v), v, gsub("(Hornet )?(.*)", "\\1\\*\\2\\*", v) )
#> [1] "*Mazda RX4*"         "*Mazda RX4 Wag*"     "*Datsun 710*"       
#> [4] "Hornet *4 Drive*"    "Hornet *Sportabout*" "Valiant"

推荐答案

可以与gsub一起使用的两个正则表达式引擎都不支持条件替换模式.

您可以使用

v <- c("Mazda RX4","Mazda RX4 Wag","Datsun 710","Hornet 4 Drive","Hornet Sportabout","Valiant")
gsub("^(?:Hornet|Valiant)\\s*(*SKIP)(*F)|(.+)", "*\\1*", v, perl=TRUE)

请看R demo online.com/r/pQNNPm/1" rel="nofollow noreferrer">regex demo和R demo online.

输出:

[1] "*Mazda RX4*"         "*Mazda RX4 Wag*"     "*Datsun 710*"       
[4] "Hornet *4 Drive*"    "Hornet *Sportabout*" "Valiant"   

要确保第一个单词与完整单词匹配,请添加\b:"^(?:Hornet|Valiant)\\b\\s*(*SKIP)(*F)|(.+)".

一定要用perl=TRUE号.

Regex details:

  • ^(?:Hornet|Valiant)\s*(*SKIP)(*F)-匹配字符串开头的HornetValiant,然后是零个或多个空格,匹配完成后,丢弃该匹配并使其失败,然后继续从失败位置查找下一个匹配
  • |-或
  • (.+)-尽可能多地匹配除换行符以外的一个或多个字符(字符串的其余部分).

R相关问答推荐

使用rlang s arg_match判断函数输入列表

如何使用stat_extract_all正确提取我的目标值?

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

从gtsummary包中使用tBL_strata()和tBL_summary()时删除变量标签

名称输出pmap on tible

如何在emmeans中计算连续变量的对比度

在某些栏和某些条件下,替换dfs列表中的NA

R中插入符号训练函数的中心因子和尺度因子预测

移除仪表板Quarto中顶盖和车身之间的白色区域

如何对2个列表元素的所有组合进行操作?

R Select()可以测试不存在的子集列

条形图顶部与其错误条形图不对齐

根据约束随机填充向量的元素

`-`是否也用于数据帧,有时使用引用调用?

Rmarkdown::Render vs Source()

有没有办法将基于每个值中出现的两个关键字或短语的字符串向量重新编码为具有这两个值的新向量?

如何在R中创建这些列?

具有自定义仓位限制和计数的GGPLATE直方图

如何在shiny 的应用程序 map 视图宣传单中可视化单点

如何创建一个由一个连续变量和一个因素变量组成的复杂方框图?