使用替换在R表达式中进行变量替换

时间:2015-07-13 01:23:38

标签: r expression substitution

我想使用substitute()在表达式中进行变量替换,而不用计算表达式。例如,我有:

expr1 <- expression(if(x){
    return(y)
} else {
    return(z)
})

我想要做的是将以下结果分配给&#34; expr1&#34;:

expression(if(cos(x)){
    return(y)
} else {
    return(z)
 })

做这样的事情:

expr2 <- substitute(expr1, list(x=cos(x)))

但这不起作用,因为替代品并没有评估它的第一个论点。所以我回到原始变量:

expr1

现在here它表示要在分配给变量的表达式中进行替换,我必须执行substitute()两次,然后执行eval(),如下所示:

expr2 <- eval(substitute(substitute(e, list(x = cos(x))), list(e = expr1)))

当我执行此语句时,我确实得到了一个分配给&#34; expr2&#34;的表达式,但它没有包含所需的替换:

expression(if (x) {
    return(y)
} else {
    return(z)
})

我可以将哪种语法应用于&#34; expr1&#34;所以我得到了我想要分配给&#34; expr2&#34;的结果,即:

expression(if (cos(x)) {
    return(y)
} else {
    return(z)
})

3 个答案:

答案 0 :(得分:4)

这似乎可以解决问题

do.call('substitute', list(expr1[[1]], list(x=quote(cos(x)))))
# if (cos(x)) {
#     return(y)
# } else {
#     return(z)
# }

首先,我使用do.call将未评估的表达式作为参数传递给substitute()而不是双倍substitute。其次,expression()实际上就像一个容器对象。您只对更改表达式第一个元素的代码块感兴趣。您可以避开expression()并使用quote()来避免&#34;取消装箱&#34;

expr2 <- quote(if(x){ return(y) } else { return(z) })
do.call('substitute', list(expr2, list(x=quote(cos(x)))))

这两个类型都将返回类型&#34;如果&#34;。如果需要,可以将其包装在as.expression()

as.expression(do.call('substitute', list(expr1[[1]], list(x=quote(cos(x))))))
# expression(if (cos(x)) {
#     return(y)
# } else {
#     return(z)
# })

答案 1 :(得分:0)

您必须通过将cos(x)包装在嵌套x = quote() ADDED的substitution()函数中来添加[:每个文档,您可以使用[[,{{ 1}}或$。您必须在超级替换调用中使用[[对表达式对象进行子集化。试试这个:

expr2 <- eval(substitute(substitute(e, list(x=quote(cos(x)))), list(e = expr1[[1]])))

expr2
#if (cos(x)) {
#  return(y)
#} else {
#  return(z)
#}

要将expr2设置为表达式,请致电:as.expression(expr2)

答案 2 :(得分:0)

替代方法可能是:

x <- expr(cos(x)) 

expr2 <- expr(if (!!x) {
                return(y)
                 } else {
                 return(z) })