R中的missing()行为

时间:2017-01-21 02:00:55

标签: r function

我正在编写 R函数,其中missing()给我带来了问题。正如代码中所评论的那样,第一个ifelse效果很好,但不是第二个。为什么呢?

powert <- function(d,a,n1,n2,tl){

 H1 <- seq(-3,3,by=.001)     

 df <- ifelse(missing(n2), n1-1, (n1+n2)-2)        # Behaving fine
Hcp <- ifelse(missing(n2),H1*sqrt(n1),H1*sqrt((n1*n2)/(n1+n2))) # !!! MISBEHAVING !!! #


tcrit2 <- ifelse(tl==1 & H1>0,qt(1-a,df),ifelse(tl==2 & H1>0,-qt(a/2,df),ifelse(tl==1 & H1<0,qt(a,df),
          ifelse(tl==2 & H1<0,qt(a/2,df),ifelse(tl==1 & H1==0,qt(1-a,df),-qt(a/2,df))))))

TII <- ifelse(tl==1 & H1>0,pt(tcrit2,df,Hcp),  ifelse(tl==2 & H1>0,pt(tcrit2,df,Hcp)-pt(-tcrit2,df,Hcp),
       ifelse(tl==1 & H1<0,1-pt(tcrit2,df,Hcp),ifelse(tl==2 & H1<0,1-(pt(tcrit2,df,Hcp)+(1-pt(-tcrit2,df,Hcp))),
       ifelse(tl==1 & H1==0,1-a,1-a)))))

Pwr <- 1-TII

     ESto80 <- if(d>0){H1[min(which(Pwr>=.8 & H1>0))]}  

          else if(d<0){H1[max(which(Pwr>=.8 & H1<0))]}

          else        {0}

plot(H1,Pwr,type = "l",las=1,yaxs="i",ylim=c(0,1),lwd=2)

cat("DF behaving fine = ",df)}

## Verify here:
powert(d=.5,a=.05,n1=20,n2=20,tl=2)

1 个答案:

答案 0 :(得分:3)

而不是

Hcp <- ifelse( missing(n2), H1 * sqrt(n1), H1 * sqrt((n1*n2)/(n1+n2)) )

使用

if (missing(n2)) Hcp <- H1 * sqrt(n1)
else Hcp <- H1 * sqrt((n1*n2)/(n1+n2))

ifelse返回的对象的长度由逻辑语句的长度决定。这里,H1是由seq创建的向量,但missing(n2)是单个逻辑值。因此,如果您使用ifelse,则只能获得一个值,而不是矢量值。这告诉您ifelse不能与if ... else ...等效地使用。{/ p>