2013-02-21 65 views
3

我试图将R中的多个表达式合并到一个表达式中。理想情况下,我将能够做这样的事情: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 http://lehrfeld.me/images/c.jpg

到了我可以插入一些矢量a获得x的功能。我在这里做错了什么?

+1

R不是一个符号代数程序。你应该关注@thelatemail和mnel。 R是一种功能语言。 – 2013-02-21 04:16:41

回答

5

请勿使用表达式,使用函数。该

从我可以破译,下面就做你想做的

# 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 
+0

好吧,这个方法好像是我需要的 - 谢谢! – psychometriko 2013-02-21 18:37:46

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’ 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’. 
+0

感谢您的回复。这个问题是,我不知道每个单独的表达式在检查数据向量'a'之前的确切形式。我发布了一个我的问题的非常简化的版本,即我想要即时指定组合表达式,并且表达式中的每个术语(其中我只显示了两个)可以采用三种可能的形式之一。所以我实际上需要随着我去建立这个。 – psychometriko 2013-02-21 03:25:43

+0

@psychometriko - 我不知道使用函数方法会出现什么问题。只要添加或编辑'newfunc'中的一行,直到你开心。 – thelatemail 2013-02-21 04:03:40

1

你可以定义一个二元函数在一个稍微哈克的方式结合expression对象 - 让他们的字符表示,他们有*粘贴,然后再分析它:

例如在致电g %c% h时给出期望的输出。

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

+0

非常感谢这个想法!一旦我有机会对此进行测试,希望明天,我会将其标记为答案。 – psychometriko 2013-02-21 03:26:51

+1

这不起作用! (exp(a [1] * x)/(1 + exp(a [1] * x))* exp(a [2] * x)/(1 + exp(a [2] (exp(a [1] * x)/(1 + exp(a [1] * x))* exp(a [2] * x) /(1 + exp(a [2] * x))'。并且肯定不会让你传递一个向量'a'或'x'来得到x的函数,你可以在R – mnel 2013-02-21 03:46:25

+0

中评估谢谢。但你的解决方案肯定更好。 – 2013-02-21 18:50:42

2

这是一个古老的问题,但令人惊讶的是,没有给出简单的答案。正如评论中所说,“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向导定义的“口语”意义上的表达式)的最简单方式。