如果在R中没有按预期工作

时间:2014-09-24 08:57:56

标签: r if-statement

我正在尝试使用命令ifelse在R中创建一个矢量函数,如下所示

temp <- function(p){
ifelse(p < 0.5 *(1 + 0.5), (1 + 0.5) * qnorm(p/(1 +0.5)), (1 - 0.5) * qnorm((p - 0.5)/(1 - 0.5)))
}

该函数适用于标量值,例如

> temp(0.1)
[1] -2.251629
> temp(0.9)
[1] 0.4208106

但不适用于矢量:

> temp(c(0.1,0.9))
[1] -2.2516289  0.4208106
Warning message:
In qnorm((p - 0.5)/(1 - 0.5)) : NaNs produced

奇怪的是它返回正确的答案,但表示警告。

我做错了什么?似乎ifelse正在评估向量p的所有条目中的两个函数,这应该通过此命令来避免。

1 个答案:

答案 0 :(得分:1)

ifelse基本上是这样做的:

p<- c(.1,.9)
a<-(1 + 0.5) * qnorm(p/(1 +0.5))
b<- (1 - 0.5) * qnorm((p - 0.5)/(1 - 0.5))
c<-NULL
c[which(p < 0.5 *(1 + 0.5))] <-a[which(p < 0.5 *(1 + 0.5))]
c[which(!(p < 0.5 *(1 + 0.5)))] <-b[which(!(p < 0.5 *(1 + 0.5)))]

也就是说,它创建了一个矢量,用于&#39;是&#39;并且没有&#39; no&#39;的向量。 &#39; no&#39;它创建的向量会引发警告。

文档中的示例提到了这一点。

x <- c(6:-4)
sqrt(x)  #- gives warning
sqrt(ifelse(x >= 0, x, NA))  # no warning

## Note: the following also gives the warning !
ifelse(x >= 0, sqrt(x), NA)