【发布时间】:2014-07-23 16:39:20
【问题描述】:
我想验证我传递给函数的两个参数是否有效。
为此,我正在检查我分配给“state”变量的“State”值是否在状态列表“statelist”中。然后我检查我分配给我的“测量”变量的“测量”值是否在我的测量列表“测量列表”中。如果第一次检查失败,则应生成“无效状态”错误消息。如果第二次检查失败,则应生成“无效测量”错误消息。如果两项检查都通过,我希望函数最低
这是我的数据框,“数据”:
school<-c("NYU", "BYU", "USC", "FIT", "Oswego","UCLA","USF","Columbia")
state<-c("NY","UT","CA","NY","NY","CA", "CA","NY")
measure<-c("MSAT","MSAT","GPA","MSAT","MSAT","GPA","GPA","GPA")
score<-c(590, 490, 2.9, 759, 550, 1.2, 3.1, 3.2)
data<-data.frame(school,state, measure,score)
这个函数检查我有一个有效的州缩写:
teststate<-function(state){
statelist<-(c(state.abb,"DC","GU","MP","PR","VI"))
if(state %in% statelist){
testmeasure(measure)
} else{
stop("invalid state")
}
}
此函数检查我指定的度量值是否在我的度量值列表中:
testmeasure<-function(measure){
measurelist<-c("MSAT","GPA","VSAT")
if(measure %in% measurelist){
lowest(state, measure)
} else{
stop("invalid measure")
}
}
这是有效性检查成功后应该运行的主要功能:
lowest <- function(state, measure){
answer<-subset(data,subset=(state==State & measure==Measure))
order.answer<-order(answer$score,answer$school)
answer1<-as.matrix(answer[order.answer,])
answer1[1,1]
}
对于这个例子:
lowest("NY","MSAT")
正确答案应该是[1]“Owsego”,但是当我完整运行代码时,它永远不会完成,控制台只是显示:
+ lowest("NY","MSAT")
+
当我在函数之外独立测试每个模块时,它们都可以工作。
【问题讨论】:
-
这些加号是从哪里来的?它们通常是 R 的继续提示,这意味着您还没有关闭括号或 " 并且 R 想要更多。
-
只是出于好奇,有没有想过使用
stopifnot()? -
我得到一个不同的错误,因为您的“最低”函数中有“状态”,但您构造的数据框的“状态”是小写的,并且 R 区分大小写。如果你解决了这个问题(并为“measure”修复了“Measure”),那么我会得到“Oswego”。
标签: r function validation arguments