Манипулирующие выражения в R - PullRequest
9 голосов
/ 02 марта 2012

Я ищу способ создания выражения, являющегося произведением двух данных выражений.Например, предположим, у меня есть

e1 <- expression(a+b*x)
e2 <- expression(c+d*x)

Теперь я хочу программно создать выражение (e1)*(e2):

expression((a+b*x)*(c+d*x))

Фон Я пишу функцию подгонки модели,Модель состоит из двух частей, которые определяются пользователем.Мне нужно уметь «обрабатывать» их отдельно, а затем создавать комбинированное выражение и «обрабатывать» его как одну модель.«Обработка» включает в себя получение числовых производных, а функция deriv требует выражения в качестве входных данных.

Ответы [ 3 ]

5 голосов
/ 02 марта 2012

Я не слишком часто с этим сталкиваюсь, но что-то вроде этого работает

e1 <- expression(a + b*x)
e2 <- expression(c + d*x)
substitute(expression(e1*e2), list(e1 = e1[[1]], e2 = e2[[1]]))
# expression((a + b * x) * (c + d * x))
5 голосов
/ 02 марта 2012

Попробуйте это:

e1 <- quote(a+b*x)   # or expression(*)[[1]]
e2 <- quote(c+d*x)
substitute(e1 * e2, list(e1=e1, e2=e2))
2 голосов
/ 02 марта 2012

В вашем случае это, вероятно, излишне, но пакет 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 каждый.

Работа изнутри, код выше:

  1. Извлекает два объекта call, используя [[1]]
  2. Использует as.call() для создания нового вызова, который является произведением двух call объектов.
  3. Наконец, обертываем результирующую call резервную копию как expression требуемый объект.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...