2013-02-21 66 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嚮導定義的「口語」意義上的表達式)的最簡單方式。