R中的组合表达式
我试图将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的函数。我做错了什么?不要使用表
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)))