【问题标题】:executing a function as an ifelse condition作为 ifelse 条件执行函数
【发布时间】:2014-07-29 17:13:21
【问题描述】:

在以下示例中,我定义了“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"

另外,当我使用无效状态“NN”进行测试时,

myFunc("NN", "GRE")

未触发“无效状态”消息,并生成与我使用有效状态时相同的错误消息。

我组织三个 ifelse 语句的方式有问题吗?我想将两个错误检查排除在函数之外,以便函数只处理子集。

【问题讨论】:

  • 1-您最后的ifelse 没有任何意义。 2-在您的全局环境中没有称为“状态”或“测试”的变量。 3- 即使你最后一个 ifelse 是正确的,你至少缺少 2 个括号
  • 查看?stopifnot

标签: r function if-statement


【解决方案1】:

我会这样做,我改用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

【讨论】:

  • 我会将子集操作放在else 语句中,因此只有在两个输入都有效时才对其进行评估,否则看起来不错,+1
【解决方案2】:

有更好的方法来处理错误,但这里是修复函数​​的方法。您需要在函数中使用 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 

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多