【问题标题】:R: Define ranges from text using regexR:使用正则表达式定义文本范围
【发布时间】:2018-03-12 15:44:44
【问题描述】:

我需要一种方法来调用依赖于文本中字符串的已定义变量。 假设我有五个变量(r010、r020、r030、r040、r050)。 如果有该形式的给定文本"r010-050" 我想要所有五个变量的值的总和。

整个文本看起来像"{r010-050} == {r060}" 该等式的第一部分需要替换为五个变量的总和,并且由于 r060 也是一个变量,因此结果(通过解析文本)应该是一个逻辑值。

我认为正则表达式将再次在这里提供帮助。 任何人都可以帮忙吗? 谢谢。

【问题讨论】:

  • 变量定义在哪里?在全局环境中,在列表中还是在其他地方?
  • 变量存储在全局环境中

标签: r regex windows parsing variables


【解决方案1】:

定义输入:变量r010 等我们假设是标量和字符串s

然后定义一个匹配 {...} 部分的模式pat 和一个函数Sum,它接受pat 中的3个捕获组(即与括号内的pat 部分匹配的字符串)并执行所需的总和。

使用 gsubfn 匹配模式,将捕获组传递给 Sum 并将匹配替换为 Sum 的输出。然后评价一下。

在示例中,全局环境中名称介于 r010r050(含)之间的唯一变量是 r010r020(如果它们存在,它会使用更多)并且因为它们总和为 @987654333 @ 它返回 TRUE。

library(gsubfn)

# inputs
r010 <- 1; r020 <- 2; r060 <- 3
s <- "{r010-050} == {r060}"

pat <- "[{](\\w+)(-(\\w+))?[}]"
Sum <- function(x1, x2, x3, env = .GlobalEnv) {
  x3 <- if(x3 == "") x1 else paste0(gsub("\\d", "", x1), x3)
  lst <- ls(env)
  sum(unlist(mget(lst[lst >= x1 & lst <= x3], envir = env)))
}
eval(parse(text = gsubfn(pat, Sum, s)))
## [1] TRUE

【讨论】:

  • 谢谢。如果s 看起来像{r180} * (sum(r010-100, r130, r150) - {r160}) == {r110} 一样硬核,那么必须如何更改代码?在这里,需要进行五步求值,首先是 r010 到 r100 的和,第二是和括号的和,第三是差,第四是乘法,第五是等式……你能帮忙吗?
  • 像这样编写输入,假设您已经适当地定义了 r... 变量,现有代码将起作用:s &lt;- "{r180} * (sum({r010-100}, {r130}, {r150}) - {r160}) == {r110}"
  • 如果s 就像sum(c010, c020, c030, c110-130, c150, c170) == {c180}pat 更改为(\\w+)(-(\\w+))? b &lt;- gsubfn(pat, Sum, s); eval(parse(text = b)) 的结果将是0(498278, 470925, 459064, 1494628, 510047, 520594) == {489302}... 所以看起来公式有效,但单词sum 替换为0 .. 必须更改什么以便sum-command 保持不变并且eval 的结果到底是逻辑值?谢谢
猜你喜欢
  • 2021-07-02
  • 1970-01-01
  • 2012-05-10
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多