在 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, sapply
与 for
循环相同,只是速度较慢。对于这样简单的操作,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 <- 1", "b <- 2")))
。您将在工作区中找到对象 a
和 b
。【参考方案2】:
只是为了表明您也可以使用 for 循环来做到这一点:
result <- numeric(length(foo))
foo <- parse(text=foo)
for(i in seq_along(foo))
result[i] <- eval(foo[[i]])
我不喜欢单独使用 *apply
函数,但在这种情况下,sapply
确实会带来更简单、更清晰的代码。
【讨论】:
以上是关于在 R 中,计算字符串向量中的表达式的主要内容,如果未能解决你的问题,请参考以下文章