我想使用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)
})
答案 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) })