4

R の複数の式を 1 つの式に結合しようとしています。理想的には、次のようなことができます。

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

おそらく関数を使用して目的を達成するためのより簡単な方法がありますが、これは 2 つの「呼び出し」(つまり、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文字表現を取得し、 で貼り付けて*から、再解析します。

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

g %c% hたとえば、 を呼び出すと、目的の出力が得られます。

編集:以前のエラーを修正するために回答が更新されました。ありがとうムネル!

于 2013-02-21T03:21:31.580 に答える