В вашем случае это, вероятно, излишне, но пакет Ryacas
может быть полезен для выполнения более сложных символических манипуляций такого рода:
library(Ryacas)
yacas(expression(e1*e2))$text
# expression((a + b * x) * (c + d * x))
Кроме того, вместо использования substitute()
вы можете создать то же выражение в базе R следующим образом:
as.expression(as.call(list(as.symbol("*"), e1[[1]], e2[[1]])))
# expression((a + b * x) * (c + d * x))
Пояснительная записка: Один изначально запутывающий аспект работы с expression
объектами заключается в том, что они действительно списки языковых объектов - даже когда (как это часто бывает) те списки содержат только один объект. Например, в вашем вопросе оба e1
и e2
являются списками длины 1, содержащими по одному объекту call
каждый.
Работа изнутри, код выше:
- Извлекает два объекта
call
, используя [[1]]
- Использует
as.call()
для создания нового вызова, который является произведением двух call
объектов.
- Наконец, обертываем результирующую
call
резервную копию как expression
требуемый объект.