r语言 - 如何保存一个表达式与乘法以后调用它?



我希望保存这样一个表达式:

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&;

最终,我将此用于阿波罗的有序logit模型,其中我必须制作60个不同的实用程序规格。我认为将规范捆绑到一个简短的表达式中会更容易,这样我就可以只更改规范即可重新运行相同的代码。规范包括定义beta变量和效用函数。我可以将这种方法用于具有如下结构的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

给出错误"对象'beta_a'未找到"。b_specification1和u_specification1都在测试版和实用程序之前运行。

使用quote定义表达式,然后使用eval对其求值

e <- quote(a + b)
a <- 1
b <- 2
eval(e)
## [1] 3

也可以将其定义为字符串,在这种情况下parse它,然后求值。

ch <- "a + b"
a <- 1
b <- 2
eval(parse(text = ch))
## [1] 3

注意,eval有一个envir参数,以防您需要在与当前环境不同的环境中查找变量名来评估它。例如,

f <- function(s, envir = parent.frame()) {
eval(parse(text = s), envir)
}
a <- 1
b <- 2
g <- function() {
a <- 3
b <- 4
c(f("a+b"), f("a+b", .GlobalEnv))
}
g()
# [1] 7 3

要组合多个表达式,请使用substitute,但要小心,因为它在控制台顶层与在函数中运行时的行为不同。如果在函数中运行,则不需要第一个示例中的第二个参数。

spec1 <- quote(beta_a * a + beta_b * b)
spec2 <- quote(beta_d * d + beta_e * e)
# run at top level
substitute(spec1 + spec2, as.list(environment()))
## beta_a * a + beta_b * b + (beta_d * d + beta_e * e)
# same
substitute(spec1 + spec2, list(spec1 = spec1, spec2 = spec2))
## beta_a * a + beta_b * b + (beta_d * d + beta_e * e)

# run within a function
f <- function() {
spec1 <- quote(beta_a * a + beta_b * b)
spec2 <- quote(beta_d * d + beta_e * e)
substitute(spec1 + spec2)
}
if (exists("spec1")) rm(spec1)
if (exists("spec2")) rm(spec2)
f()
## beta_a * a + beta_b * b + (beta_d * d + beta_e * e)

如果使用字符串,请使用pastesprintf

最新更新