2017-10-08 179 views
0

我試圖創建一個函數,它依賴於x的值,返回兩個函數之一。當我創建以下函數時,出現錯誤,我不知道爲什麼。在IF語句中意外的'<='R

t <- c(0.1,0.9,1.5) 

squeze <- function(x){ 
if(t[1]<x<=t[2]){ 
    exp(a1*x+b1) 
} else { 
    exp(a2*x+b2) 
} 
} 

錯誤消息:

Error: unexpected '<=' in: 
"squeze <- function(x){ 
if(t[1]<x<=" 
> exp(a1*x+b1) 
Error: object 'x' not found 
> } else { 
Error: unexpected '}' in " }" 
> exp(a2*x+b2) 
Error: object 'x' not found 
> } 
Error: unexpected '}' in " }" 
> } 
Error: unexpected '}' in "}" 

我會非常感激,如果有人能指出什麼我已經錯過了。

提前,謝謝!

+3

每個不等式都是一個測試,並返回T或F.要組合2個測試,必須使用'&'或'|'。所以你可以做't [1] Gregor

+0

非常感謝你@Gregor! –

回答

2

解析器不喜歡它,這就是爲什麼你會得到一個錯誤。

而且這是一件好事,因爲它可能有麻煩已經得到了你,請參閱:

(1 < 3) < 2 # TRUE 

1 < 3TRUE然後TRUE被脅迫1,並且1<2TRUE

在該R >是功能

`>` # function (e1, e2) .Primitive(">")  
`>`(1,2) # FALSE  

在此立GHT你就會明白爲什麼你試過沒有意義的R.

什麼

而是使用if(t[1] < x & x <= t[2])

如果排除這兩個界限,你可以使用data.table::between

between(x, t[1], t[2],F) 

如果包括邊界您可以使用data.table::betweendplyr::between

between(x, t[1], t[2]) 

data.table還允許語法x %between% c(t[1], t[2])

+0

謝謝您的全面解答@Moody_mudskipper! 在某種程度上,這與格里高爾寫的一樣,但是這個答案有點更加詳細和解釋性。 –