如何将 R 中的一列字符串表达式作为管道的一部分进行解析和求值?
在下面的示例中,我生成了所需的列,evaluated
。但我知道这不是正确的做法。我尝试采取 tidyverse 方法。但我只是很困惑。
library(tidyverse)
df <- tibble(name = LETTERS[1:3],
to_evaluate = c("1-1+1", "iter+iter", "4*iter-1"),
evaluated = NA)
iter = 1
for (i in 1:nrow(df)) {
df[i,"evaluated"] <- eval(parse(text=df$to_evaluate[[i]]))
}
print(df)
# # A tibble: 3 x 3
# name to_evaluate evaluated
# <chr> <chr> <dbl>
# 1 A 1-1+1 1
# 2 B iter+iter 2
# 3 C 4*iter-1 3
作为管道的一部分,我尝试了:
df %>% mutate(evaluated = eval(parse(text=to_evaluate)))
df %>% mutate(evaluated = !!parse_exprs(to_evaluate))
df %>% mutate(evaluated = parse_exprs(to_evaluate))
df %>% mutate(evaluated = eval(parse_expr(to_evaluate)))
df %>% mutate(evaluated = parse_exprs(to_evaluate))
df %>% mutate(evaluated = eval(parse_exprs(to_evaluate)))
df %>% mutate(evaluated = eval_tidy(parse_exprs(to_evaluate)))
这些都不起作用。
你可以试试:
df %>%
rowwise() %>%
mutate(iter = 1,
evaluated = eval(parse(text = to_evaluate))) %>%
select(-iter)
name to_evaluate evaluated
<chr> <chr> <dbl>
1 A 1-1+1 1
2 B iter+iter 2
3 C 4*iter-1 3
按照这个逻辑,其他可能性也可以发挥作用。使用rlang::parse_expr()
:
df %>%
rowwise() %>%
mutate(iter = 1,
evaluated = eval(rlang::parse_expr(to_evaluate))) %>%
select(-iter)
另一方面,我认为引用很重要@马丁·马赫勒 https://stackoverflow.com/questions/1743698/evaluate-expression-given-as-a-string:
(可能)唯一的连接是通过 parse(text = ....) ,一切都很好
R 程序员应该知道这很少是一种高效或安全的方法
意味着构造表达式(或调用)。而是进一步了解
Replace()、quote() 以及可能使用的功能
do.call(替代,……)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)