gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:03:20 25 4
gpt4 key购买 nike

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

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

我想做的是将以下结果分配给“expr1”:
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)))

当我执行这个语句时,我得到一个分配给“expr2”的表达式,但它不包含所需的替换:
expression(if (x) {
return(y)
} else {
return(z)
})

我可以对“expr1”应用什么语法,以便得到我想要分配给“expr2”的结果,即:
expression(if (cos(x)) {
return(y)
} else {
return(z)
})

最佳答案

这似乎可以解决问题

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()避免“拆箱”
expr2 <- quote(if(x){ return(y) } else { return(z) })
do.call('substitute', list(expr2, list(x=quote(cos(x)))))

这两个都将返回一个类型为“if”的类。如果需要,可以将其包装在 as.expression() 中.
as.expression(do.call('substitute', list(expr1[[1]], list(x=quote(cos(x))))))
# expression(if (cos(x)) {
# return(y)
# } else {
# return(z)
# })

关于r - 使用替换在 R 表达式中进行变量替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31374251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com