4

我正在尝试将 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)

其中a是给定的数据向量,x是唯一的未知数(并且在所有表达式中都是相同的未知数)。c会回来

R> c
expression(exp(a[1]*x)/(1 + exp(a[1]*x)) * exp(a[2]*x)/(1 + exp(a[2]*x)))

现在,当我这样做时,我会得到

R> c
expression(g * h)

我想要一个方程

C
(来源:lehrfeld.me

我可以在其中插入一些向量a以获得x. 我在这里做错了什么?

4

5 回答 5

7

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

据我所知,以下将做你想要的

# 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)

如果您想要expression与此相关联,以便您可以绘制等式的文本,则以下内容将起作用

expr <- expression(exp(1)^(a*x)/(1 + exp(1)^(a*x))

g <- do.call(substitute, list(as.list(expr)[[1]], env= list(a=3)))
h<- do.call(substitute, list(as.list(expr)[[1]], env= list(a=2)))
'%c%' <- function(a,b) bquote(.(a) %*% .(b))

fooExpr <- g %c% h
于 2013-02-21T03:01:55.047 回答
4

这是一个古老的问题,但令人惊讶的是,没有给出简单的答案。正如评论中所说,“R 不是符号代数程序”;然而,R 拥有处理表达式的所有必要手段。我不知道如何使用expressions(在技术意义上,请参阅?expression),但使用以下方法非常容易calls

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)))

可能有更简单的方法来实现您想要的(可能使用函数),但这是合并两个“调用”(即 R 向导定义的“口语”意义上的表达式)的最简单方法。

于 2016-04-12T13:53:24.930 回答
2

您可能想要一个函数而不是我认为的表达式:

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 中的帮助文件所说:

  ‘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’. 
于 2013-02-21T03:18:14.397 回答
2

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

"%c%" <- function(x, y) parse( text=paste(x, "*", y) )

例如,在调用 时给出所需的输出g %c% h

编辑:更新答案以纠正先前的错误;谢谢mnel!

于 2013-02-21T03:21:31.580 回答
1

使用 rlang 从其他表达式创建表达式比使用基本 R 更直接 (IMO)。使用 !! (bang-bang) 强制评估表达式中的对象。

library(rlang)

a <- c(2, 3)
g <- expr(exp(!!a[1] * x) / (1 + exp(!!a[1] * x)))
h <- expr(exp(!!a[2] * x) / (1 + exp(!!a[2] * x)))
c <- expr(!!g * !!h)
c
#> exp(2 * x)/(1 + exp(2 * x)) * (exp(3 * x)/(1 + exp(3 * x)))

reprex 包于 2020-03-21 创建(v0.3.0)

于 2020-03-21T12:51:47.807 回答