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

如何保存含乘法的表达式以便后续调用?Apollo有序logit模型场景

问题与解决方法

问题描述

想要保存未求值的表达式,调用时直接返回表达式本身:

# 期望的赋值方式
expression <- c(beta_a*a + beta_b*b + beta_d*d) 
# 期望的调用结果
expression
> beta_a*a + beta_b*b + beta_d*d

但运行赋值语句时会报错Object 'beta_a' not found。

实际场景是在Apollo中构建有序logit模型,需要创建60种不同的效用规格,将规格打包为简短表达式以重复运行代码。其中beta参数的定义已成功实现复用:
原代码:

betas = c(beta_a = 0, beta_b = 0, beta_d = 0)

改写为复用形式:

b_specification1 <- c(beta_a = 0, beta_b = 0, beta_d = 0)
betas = b_specification1

但效用函数的复用尝试失败:

u_specification1 <- c(beta_a*a + beta_b*b + beta_d*d) 
utility = u_specification1

执行时出现object 'beta_a' not found错误,且b_specification1和u_specification1均在betas和utility之前定义。

解决方法

问题根源是R会立即对赋值语句中的表达式求值,而此时beta_a等对象尚未定义。要保存未求值的表达式,需使用quote()或expression()函数:

方法1:用quote()保存单个表达式

u_specification1 <- quote(beta_a*a + beta_b*b + beta_d*d)
utility = u_specification1

调用utility即可返回表达式本身:

utility
#> beta_a * a + beta_b * b + beta_d * d

方法2:用expression()保存(支持多表达式)

如果需要保存多个效用规格表达式,可使用expression(),调用时取对应索引的表达式:

u_specification1 <- expression(beta_a*a + beta_b*b + beta_d*d)
utility = u_specification1[[1]]

同样能得到预期的未求值表达式。

在Apollo模型中使用时,无需额外手动求值,Apollo的模型拟合逻辑会自动处理这类未求值表达式的计算,只需确保正确传递表达式对象即可。

内容的提问来源于stack exchange,提问作者Victor Nielsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:00:15