2014-09-24 131 views
1

我试图使用命令ifelse如下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 

创建R中的矢量功能但不适用于矢量:

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

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

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

+0

什么是警告信息?请提供复制您问题的示例输入。 – Roland 2014-09-24 09:03:15

+0

什么是警告? – mgriebe 2014-09-24 09:03:16

+0

@Roland和mgriebe完成,谢谢。 – 2014-09-24 09:04:47

回答

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)))] 

也就是说,它创造了“是”一个载体和“不”的向量。它创建的'否'矢量会引发警告。

本文档中的例子暗示了这一点。

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) 
+0

谢谢。那么,为什么这种标量输入不会发生? – 2014-09-24 09:29:54

+0

@JakeJackson:如果您查看'ifelse'的前几行,则会测试是否评估了“length(test)== 1”以及“yes”或“no”;不是都。 – 2014-09-24 09:32:26

+0

@alexis_laz非常感谢。然后,我需要忽略在这种情况下无害的警告消息,或者以输入方式评估函数。 – 2014-09-24 09:34:11