関数がシーケンスを引数としてとらず、関数がシーケンスの前の値で関数自体から返された値を使用する場合、シーケンスに関数を適用するのが難しい。
次の問題があります。私のメイン メソッド functionでは、最初に , , ,をmainn
初期化し、それを関数の引数として使用します。(値を返し、 3 つの値を返すという意味で、私のとが正しく/適切に機能していることを確信していることに注意してください)fa
mu.a
mu.b
sigma
step2
px.q4
step2
px.q4
step2
これが私の質問が入るところです。シーケンスに対して適用を実行したいのですがstep2
、シーケンスに対して適用するたびに (最初の反復を除く)、step2
関数は初期値ではなく、前のfa.iter
、mu.a.iter
、の値を使用します。これはRで行うことができますか?それとも、この種の質問には for ループを使用する必要がありますか?mu.b.iter
step2
forループを使用してこれを行うことができました。しかし、私は R についてもっと学びたいと思っています。問題を回避するために使用できる (より効率的な) 特定のコマンドはありますか?
#this function returns a value
px.q4 <- function(fa, mu.a, mu.b,sigma)
{
v <- fa + mu.a + mu.b * sigma
v
}
#this function returns 3 values, fa.iter, mu.a.iter, and mu.b.iter
#for completeness I include the full code of what i am trying to do.
#But all you need to know is that the function step2 returns 3 values .
step2 <- function(fa, mu.a, mu.b)
{
#set prev = iter values // this also allow set initial values = prev in
#the 1st iteration
mu.a.prev <- mu.a.iter
mu.b.prev <- mu.b.iter
fa.prev <- fa.iter
#draw a trail point x.trail from propsal distribution ~ N(x_i-1,0.1)
mu.a.trail <- rnorm(1, mu.a.prev, 0.1)
mu.b.trail <- rnorm(1, mu.b.prev, 0.1)
fa.trail <- rnorm(1, fa.prev, 0.1)
while(fa.trail < 0 || fa.trail > 1)
{
fa.trail <- rnorm(1, fa.prev, sigma)
}
#if p(x_trail) >= p(x_i-1) set x_i = x_trail
a <- px.q4(fa.trail, mu.a.trail, mu.b.trail, sigma)
b <- px.q4(fa.prev ,mu.a.prev , mu.b.prev,sigma)
if(a >= b)
{
mu.a.iter <- mu.a.trail
mu.b.iter <- mu.b.trail
fa.iter <- fa.trail
}else{
r <- runif(1,min = 0, max = 1)
if(r < a/b){
mu.a.iter <- mu.a.trail
mu.b.iter <- mu.b.trail
fa.iter <- fa.trail
}else{
mu.a.iter <- mu.a.prev
mu.b.iter <- mu.b.prev
fa.iter <- fa.prev
}
}
res <- list(mu.a.iter, mu.b.iter, fa.iter)
res
}
#main body
mainn <- function(n,fa,mu.a,mu.b)
{
sigma <- 0.3
mu.a.init <- mu.a #initial values
mu.b.init <- mu.b
fa.init <- fa #(must be between 0 and 1)
#set initial values = iter values (for entering for loop)
mu.a.iter <- mu.a.init
mu.b.iter <- mu.b.init
fa.iter <- fa.init
#where to the logical flaw comes in and how can I overcome it
y <- sapply(n,FUN = step2)
}