在 R 中,计算字符串向量中的表达式

Posted

技术标签:

【中文标题】在 R 中,计算字符串向量中的表达式【英文标题】:In R, evaluate expressions within vector of strings 【发布时间】:2014-09-18 11:01:16 【问题描述】:

我希望计算一个包含算术表达式的字符串向量——“1+2”、“5*6”等。

我知道我可以将单个字符串解析为表达式,然后像 eval(parse(text="1+2")) 一样对其进行评估。

但是,我更愿意在不使用 for 循环的情况下评估向量。

foo <- c("1+2","3+4","5*6","7/8") # I want to evaluate this and return c(3,7,30,0.875)
eval(parse(text=foo[1])) # correctly returns 3, so how do I vectorize the evaluation?
eval(sapply(foo, function(x) parse(text=x))) # wrong! evaluates only last element

【问题讨论】:

如何使用sapply进行矢量化? @DavidArenburg 因为他同时对向量的多个元素进行操作? @iShouldUseAName, sapplyfor 循环相同,只是速度较慢。对于这样简单的操作,for 循环将是更好的选择。在R 中,这不是您所说的“矢量化解决方案”的意思 从头开始。同一时间。 @iShouldUseAName,不,不是。我也对其进行了测试,并且 for 循环获胜。将此与您的 sapply 进行比较:for(i in seq_along(foo)) eval(parse(text = foo[i])) 【参考方案1】:

只需应用整个函数。

sapply(foo, function(x) eval(parse(text=x)))

【讨论】:

我接受这个,因为它有效,非常感谢!但是,就 David Arenburg 而言,我确实理解 sapply 和矢量化操作之间存在差异。也许“我如何序列化这个”会是一个更好的评论。 ?eval 似乎只接受一个 expr 输入,而不是一个向量,我无法将它向量化。 @JohnAndrews,你可以留在你的循环中并克服它 @JohnAndrews eval 确实计算了多个表达式,但出于返回值的目的,它将它们视为单个复合表达式。例如,试试eval(parse(text=c("a &lt;- 1", "b &lt;- 2")))。您将在工作区中找到对象 ab【参考方案2】:

只是为了表明您也可以使用 for 循环来做到这一点:

result <- numeric(length(foo))
foo <- parse(text=foo)
for(i in seq_along(foo))
    result[i] <- eval(foo[[i]])

我不喜欢单独使用 *apply 函数,但在这种情况下,sapply 确实会带来更简单、更清晰的代码。

【讨论】:

以上是关于在 R 中,计算字符串向量中的表达式的主要内容,如果未能解决你的问题,请参考以下文章

R语言--字符串操作

R: 正则表达式

R语言length函数计算向量列表字符串长度实战

R中的正则表达式:匹配所有内容,但不匹配“某些字符串”[重复]

从 R 中的字符向量中删除引号

计数+识别两个字符串向量中的常用词 [R]