You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中使用eval()计算行内公式得到意外结果的解决办法

问题原因

你当前的代码中,eval(parse(text = equation))并非逐行计算:parse(text = equation)会把所有公式解析成一个表达式集合,eval执行时会将整个t列的向量(c(1,2,3))代入所有表达式,最终仅返回最后一个表达式的计算结果(t^3的结果1,8,27),因此前两行结果不符合预期。

修复方案

有两种常用的修复方式:

方式一:使用rowwise()逐行处理

通过rowwise()让dplyr按行执行计算,此时每行的t是单个值,代入对应公式即可得到正确结果:

library(magrittr);library(dplyr)

dt <- data.frame(t = c(1,2,3),
                 equation = c("t+1", "5*t", "t^3"))

dt %<>% 
  rowwise() %>%
  mutate(y = eval(parse(text = equation))) %>%
  ungroup()

运行后结果:

t equation  y
1 1      t+1  2
2 2     5*t 10
3 3     t^3 27

方式二:使用purrr::map2()逐元素匹配计算

利用map2()将t列的每个值与对应行的公式配对,在计算时将单个t值传入表达式的执行环境:

library(magrittr);library(dplyr);library(purrr)

dt <- data.frame(t = c(1,2,3),
                 equation = c("t+1", "5*t", "t^3"))

dt %<>% 
  mutate(y = map2_dbl(t, equation, ~eval(parse(text = .y), list(t = .x))))

此方式同样能得到符合预期的结果,且在数据量较大时,效率通常优于rowwise()。

内容的提问来源于stack exchange,提问作者T X

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:05:33