R中的组合表达式

R中的组合表达式,r,expression,R,Expression,我试图将R中的多个表达式组合成一个表达式。理想情况下,我可以做这样的事情: g <- expression(exp(a[1]*x)/(1 + exp(a[1]*x))) h <- expression(exp(a[2]*x)/(1 + exp(a[2]*x))) c <- expression(g * h) 现在,当我这么做的时候 R> c expression(g * h) 我想要一个等式 (来源:) 我可以插入一些向量a,以获得x的函数。我做错了什么?不要使用表

我试图将R中的多个表达式组合成一个表达式。理想情况下,我可以做这样的事情:

g <- expression(exp(a[1]*x)/(1 + exp(a[1]*x)))
h <- expression(exp(a[2]*x)/(1 + exp(a[2]*x)))
c <- expression(g * h)
现在,当我这么做的时候

R> c
expression(g * h)
我想要一个等式


(来源:)


我可以插入一些向量
a
,以获得
x
的函数。我做错了什么?

不要使用表达式,使用函数。

根据我所能理解的,下面将做你想做的

# a function for a vector `x` and single value `a`
func <- function(x,a) { (exp(1)^(a*x)/(1 + exp(1)^(a*x))) }
# a function for  a vector `x` and vector length 2 for `a`
foo <- function(x, a){func(x,a[1]) * func(x, a[2])}

# call the function to calculate what you want.

foo(x,a)

您可能需要函数而不是表达式,我认为:

newfunc <- function(x) {
  (exp(1)^(2*x)/(1 + exp(1)^(2*x))) *
  (exp(1)^(3*x)/(1 + exp(1)^(3*x)))
}

a <- 1:10

newfunc(a)
[1] 0.8390245 0.9795856 0.9974043 0.9996585 0.9999543 0.9999938 0.9999992
[8] 0.9999999 1.0000000 1.0000000

您可以定义一个二进制函数来以一种稍微粗糙的方式组合
表达式
对象——获取它们的字符表示,用
*
粘贴它们,然后重新解析它:


“%c%”这是一个老问题,但令人惊讶的是,没有给出简单的答案。正如在评论中所说,“R不是一个符号代数程序”;但是,R具有操纵表达式的所有必要手段。我不知道如何使用
表达式
(在技术意义上,请参见
?表达式
),但是使用
调用
非常简单:

g <- quote(exp(a[1]*x)/(1 + exp(a[1]*x)))
h <- quote(exp(a[2]*x)/(1 + exp(a[2]*x)))
substitute(g*h, list(g=g, h=h))
# exp(a[1] * x)/(1 + exp(a[1] * x)) * (exp(a[2] * x)/(1 + exp(a[2] * x)))

g使用rlang从其他表达式创建表达式比使用base R更简单(IMO)。使用!!(bang-bang)强制计算表达式中的对象

库(rlang)

a谢谢你的回复。问题是,在检查数据向量
a
之前,我不知道每个表达式将采用什么形式。我发布了我的问题的一个非常简化的版本,我想动态地指定组合表达式,表达式中的每个术语(上面我只展示了两个)可以采用三种可能的形式之一。所以我实际上需要边做边做。@psychometriko-我不确定使用函数方法会有什么问题。只需在
newfunc
中添加或编辑其中一行,直到您满意为止。非常感谢您的想法!一旦我有机会测试这个,希望明天,我会把它作为答案。这是行不通的!它创建了一个
表达式('exp(a[1]*x)/(1+exp(a[1]*x))*exp(a[2]*x)/(1+exp(a[2]*x)))
,它与
表达式(exp(a[1]*x)/(1+exp(a[1]*x))*exp(a[2]*x)/(1+exp(a[2]*x))不同
。当然不会让你通过向量
a
x
得到一个可以在Rhanks中计算的x函数。我很接近,但你的解决方案肯定更好。R不是一个符号代数程序。你应该注意@thelatemail和mnel。R是一种函数语言。
newfunc <- function(x) {
  (exp(1)^(2*x)/(1 + exp(1)^(2*x))) *
  (exp(1)^(3*x)/(1 + exp(1)^(3*x)))
}

a <- 1:10

newfunc(a)
[1] 0.8390245 0.9795856 0.9974043 0.9996585 0.9999543 0.9999938 0.9999992
[8] 0.9999999 1.0000000 1.0000000
newfunc1 <- function(x) {
  (exp(1)^(2*x)/(1 + exp(1)^(2*x)))
}

newfunc2 <- function(x) {
  (exp(1)^(3*x)/(1 + exp(1)^(3*x)))
}

newfunc1(a) * newfunc2(a)
  ‘Expression’ here is not being used in its colloquial sense, that
  of mathematical expressions.  Those are calls (see ‘call’) in R,
  and an R expression vector is a list of calls, symbols etc, for
  example as returned by ‘parse’. 
g <- quote(exp(a[1]*x)/(1 + exp(a[1]*x)))
h <- quote(exp(a[2]*x)/(1 + exp(a[2]*x)))
substitute(g*h, list(g=g, h=h))
# exp(a[1] * x)/(1 + exp(a[1] * x)) * (exp(a[2] * x)/(1 + exp(a[2] * x)))