如何在R中使用带有'substitute'函数的可变字符串

How to use variable character strings with 'substitute' function in R

我需要能够用未知数量的变量值填充表达式。表达式的形状取决于变量的数量。


示例:

表达式 1: "italic(y)==a*italic(x)*b"

变成: "y=1.2 x+4.3

表达式 2: "italic(y)==a*italic(x)*b~c"

变成: "y=1.2 x+4.3 -5.3


目前我正在使用 substitute 函数,但它不能与 expression 函数一起使用:

substitute(expression("italic(y)==a*italic(x)*b"),list(a=1.23,b=2.3))

我的表达式需要随着变量数量(即列表长度)的增加而增加。因此,下一步是添加变量 c:

substitute(expression("space1*italic(y)==a*italic(x)*b*c"),list(a=1.23,b=2.3,c=3.2))

但我需要在没有任何人工干预的情况下更改代码中的表达式,并且这些代码不会从列表中读取变量值,除非我将其更改为这个(其中表达式不再可扩展,因为它不是一个字符串):

substitute(italic(y)==a*italic(x)*b*c,list(a=1.23,b=2.3,c=3.2))

我该怎么做?

这是一个脚本,可能符合您的要求。我们可以使用 for 循环迭代替换列表,然后用列表中的相应值对表达式中的占位符进行正则表达式替换。

lst <- list(a=1.23,b=2.3)
expression <- "italic(y)==a*italic(x)*b"

for (name in names(lst)) {
    expression <- gsub(paste0("\b", name, "\b"), lst[[name]], expression)
}

print(expression)

[1] "italic(y)==1.23*italic(x)*2.3"

注意,我搜索的是两边被单词边界包围的变量名。如果你的占位符被其他单词字符包围,那么我的解决方案就会失败,我们需要更改替换逻辑。