如何保存含乘法的表达式以便后续调用?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
相关产品推荐
相关产品推荐

