2016-04-12 79 views
1

我是R的新手,我試圖編寫一個函數,要求它只在特定的時間間隔內選擇值,所以我決定去k =如果它位於[下,上],則爲1;如果位於其他位置(在函數的前面定義了下和上),則爲0;但是,當我嘗試爲該函數賦值時,它始終返回此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 

新的問題 嘿,我想何時調整試圖調整數據集時這個功能,即遇到了新的問題成爲一+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

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

由於R脅迫邏輯向量在必要數值向量,治療TRUE如1和FALSE爲0,上述分配新建分配FY可以更簡潔地作爲表達:分配可以被替換不要像這樣分配'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) 

在線以上您正在分配功能function(q) ifelse(q >= lower & q <= upper, 1, 0)到矢量k,的每個元素當你真的想要被分配在作爲原始函數的參數給出的標量q上評估該函數的結果。另請注意,關閉function(q)的環境與其定義的功能的環境不同。它必須明確地用一個參數來調用才能進行評估。因此,當你打行:

C <- sum(k * bin.prob) 

R期望通過bin.prob乘以功能function(q)本身,拋出一個錯誤,當你想要做什麼是定義的標量q評估function(q)的結果乘以原始函數的參數。在這種情況下,似乎根本沒有必要定義function(q)

k[i] <- q >= lower & q <= upper