执行函数作为ifelse条件

时间:2014-07-29 17:13:22

标签: r function if-statement

在以下示例中,我定义了' myFunc',然后测试两个错误条件。如果没有满足任何错误条件,我想要' myFunc'执行。

State<-rep(c("NY","NJ"),times=5)
Test<-rep(c("LSAT", "MCAT", "GRE","TOEFL","ACT"), times=2)
Grade<-trunc(rep((seq(from=500, to=600,length.out=10))))
dat<-data.frame(Test,State,Grade)
statelist<-c("NY","NJ","CA")
testlist<-c("LSAT", "MCAT", "GRE","TOEFL","ACT","VSAT")

myFunc<-function(state,test)
{
  dat<-subset(dat,subset=(State==state & Test==test))
}

ifelse(!state %in% statelist, stop("invalid state"),
       ifelse(!test %in% testlist, stop("invalid test"),
              ifelse(myFunc)   

当我使用以下变量测试函数时:

myFunc("NY", "GRE")

我收到此错误消息:

    Error: unexpected symbol in:
"              ifelse(myFunc)       
myFunc"

此外,当我使用无效状态进行测试时,&#39; NN&#39;

  

myFunc(&#34; NN&#34;,&#34; GRE&#34;)

&#34;无效状态&#34;消息未被触发,并且在我使用有效状态时生成了相同的错误消息。

我组织我的三个ifelse陈述的方式有问题吗?我希望将两个错误检查保留在函数之外,以便该函数仅处理子集化。

2 个答案:

答案 0 :(得分:2)

以下是我将如何做到这一点,我转而使用if声明,因为这对我来说更有意义

myFunc <- function(state,test){
  dat <- subset(dat,subset=(State==state & Test==test))
  if(!state %in% statelist)
    {stop("invalid state")}
  if(!test %in% testlist)
    {stop("invalid test")}
  else 
    {return(dat)}
}

R> myFunc("NY", "GRE")
  Test State Grade
3  GRE    NY   522
R> myFunc("NN", "GRE")
Error in myFunc("NN", "GRE") : invalid state
R> myFunc("NY", "GREY")
Error in myFunc("NY", "GREY") : invalid test

答案 1 :(得分:0)

有更好的方法来处理错误,但这里是如何修复你的功能。你需要在你的功能中使用ifelse。

myFunc<-function(state,test)
{
  ifelse(!state %in% statelist, stop("invalid state", call. = FALSE),
         ifelse(!test %in% testlist, stop("invalid test", call. = FALSE), return(subset(dat,subset=(State==state & Test==test)))))  
}

 myFunc("NY", "GRE")
 > Test State Grade
 > 3  GRE    NY   522

 myFunc("NN", "GRE")
 > Error: invalid state 

 myFunc("NY", "Cake")
 > Error: invalid test