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

问题描述 投票:0回答:3

我希望计算包含算术表达式的字符串向量——“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
r evaluation arithmetic-expressions
3个回答
11
投票

只需应用整个功能即可。

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

2
投票

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

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

我不喜欢使用

*apply
函数本身,但在这种情况下,
sapply
确实会带来更简单、更清晰的代码。


0
投票

我刚刚遇到了同样的问题,并且需要速度。 它产生了下面的解决方案(函数)。 这个想法是评估向量比评估其元素更快。下面的用法是使用 dplyr 或 magrittr 包中的 '%>%' 语法。

evaluate_string <- function(x) {
    parse(text = paste(
       paste(
        "c(",
        collapse = ""
       ),
       paste(paste(x, c(rep(",", length(x) - 1), ")"), sep = ""), collapse = " "),
    collapse = " "
)) %>%
    eval() %>%
    return()}
© www.soinside.com 2019 - 2024. All rights reserved.