2016-04-12 24 views
1

私はRを使い慣れていないので、一定の間隔で値を選択するだけの関数をコーディングしようとしているので、k = 1の場合は[lower、upper]、それ以外の場合は0になります(ただし、lowerとupperは関数の前に定義されていますが、関数に値を代入しようとすると常に戻ります)関数内の不連続/区間関数をコーディングするR

myfun(10,0.5,0.05) 
#Error in k[i] <- function(p) ifelse(p >= lower & p <= upper, 1, 0) : 
# incompatible types (from closure to double) in subassignment type fix 

私は実際には何を意味するのか分かりませんが、私は答えを見つけようとしましたが、ほとんどのページでは、私がいなければ謝りますが、どんな助けでも大歓迎です。ここではf ULL機能、それが役立つかどう:

myfun <- function(a, q, m) { 
    k <- rep(0,a+1) 
    bin.prob <- rep(0,a+1) 
    for (i in 1:(a+1)) { 
    x <- i-1 
    qhat <- x/a 
    z <- qnorm(1-m/2) 
    upper <- qhat+(z*sqrt(qhat*(1-qhat)*(a^-1))) 
    lower <- qhat-(z*sqrt(qhat*(1-qhat)*(a^-1))) 
    k[i] <- function(q) ifelse(q>=lower & q<=upper, 1, 0) 
    bin.prob[i] <- dbinom(x,a,q) 
    } 
    C <- sum(k*bin.prob) 
    return(C) 
} 
myfun(10,0.5,0.05) 
#Error in k[i] <- function(q) ifelse(q >= lower & q <= upper, 1, 0) : 
# incompatible types (from closure to double) in subassignment type fix 

という新たな問題 データセットを調整しようとしたときに、この機能を調整しようとするとねえ、私は新しい問題が発生しています、つまりAとなり4XはなりX + 2

> myfun2 <- function(a,q,m) { 
+ fn <- function(a) a+4 
+ abar <- fn(a) 
+ kadj <- rep(0,abar+1) 
+ bin.prob.adj <- rep(0,abar+1) 
+ for (j in 1:(abar+1)) { 
+ x <- j-1 
+ fx <- function(x) x+2 
+ xbar <- fx(x) 
+ qhatadj <- xbar/abar 
+ z <- (1-(m/2)) 
+ upperadj <- qhatadj+(z*sqrt(qhatadj*(1-qhatadj)*(abar^-1))) 
+ loweradj <- qhatadj-(z*sqrt(qhatadj*(1-qhatadj)*(abar^-1))) 
+ kadj[j] <- q>=loweradj & q<=upperadj 
+ bin.prob.adj[j] <- dbinom(xbar,abar,q) 
+ } 
+ D <- sum(kadj*bin.prob.adj) 
+ return(D) 
+ } 
> myfun2(10,0.5,0.05) 
[1] NA 
Warning messages: 
1: In sqrt(qhatadj * (1 - qhatadj) * (abar^-1)) : NaNs produced 
2: In sqrt(qhatadj * (1 - qhatadj) * (abar^-1)) : NaNs produced 
3: In sqrt(qhatadj * (1 - qhatadj) * (abar^-1)) : NaNs produced 
4: In sqrt(qhatadj * (1 - qhatadj) * (abar^-1)) : NaNs produced 

私は、これはARを持っている理由として答えを見つけるためにしようとしてきましたNaNsの警告は負の平方根が存在する可能性があることを発見しましたか?しかし、なぜそれが起こったのか分かりません。それは私の部分では悪いコーディングであるかもしれないし、まったく別のものかもしれません(私はRに新しいです)。助けてくれてありがとう。

+0

:Rが0と1とTRUEFALSEを治療する、数値ベクトル、必要な場合に、論理ベクトルを強制するので

k[i] <- ifelse(q >= lower & q <= upper, 1, 0) 

、上記assigmentは、より簡潔に表すことができます。この 'k [i] < - function(q).....'のように割り当てるのではなく、 'fun < - function(q).......'のようにその関数を別々に定義してください。そして 'k [i] < - fun(q)'を実行します。なぜあなたは 'ifelse'を使っていますか? 'q'はベクターですか? 'q> = lower && q <=' upper'だけでなく、そうでなければそのまま残してください。 – Bhas

答えて

0

エラーメッセージが示すように、問題が行から始まる:あなたは本当に割り当てることにしたいときに上記の行で

k[i] <- function(q) ifelse(q >= lower & q <= upper, 1, 0) 

は、ベクトルkの各要素に機能function(q) ifelse(q >= lower & q <= upper, 1, 0)を割り当てます元の関数の引数として与えられたスカラーでこの関数を評価した結果qクロージャfunction(q)には、それが定義されている関数の環境とは別の環境があります。これを評価するためには、引数を指定して明示的に呼び出す必要があります。あなたが行を打ったときしたがって、:

C <- sum(k * bin.prob) 

Rはエラーを投げ、bin.probによって機能function(q)自体を乗算しようと、何をやっているしたいので定義されたスカラqためfunction(q)の評価結果を掛けるとき元の関数への引数この場合、function(q)を定義する必要はありません。割り当てはで置き換えることができる。

k[i] <- q >= lower & q <= upper 
関連する問題