私は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となり4とXはなり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に新しいです)。助けてくれてありがとう。
:Rが0と1と
TRUE
とFALSE
を治療する、数値ベクトル、必要な場合に、論理ベクトルを強制するので、上記assigmentは、より簡潔に表すことができます。この 'k [i] < - function(q).....'のように割り当てるのではなく、 'fun < - function(q).......'のようにその関数を別々に定義してください。そして 'k [i] < - fun(q)'を実行します。なぜあなたは 'ifelse'を使っていますか? 'q'はベクターですか? 'q> = lower && q <=' upper'だけでなく、そうでなければそのまま残してください。 – Bhas