我希望保存这样一个表达式:
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)
如果使用字符串,请使用paste
或sprintf
。