R 在执行函数之前验证参数
我想验证传递给函数的两个参数是否都有效 为此,我要检查分配给“State”变量的“State”值是否在状态列表“statelist”中。然后检查分配给“Measure”变量的“Measure”值是否在度量值列表“measurelist”中。如果第一次检查失败,则应生成“无效状态”错误消息。如果第二次检查失败,则应生成“无效测量”错误消息。如果两个检查都通过,我希望函数最低尝试以下操作:R 在执行函数之前验证参数,r,function,validation,arguments,R,Function,Validation,Arguments,我想验证传递给函数的两个参数是否都有效 为此,我要检查分配给“State”变量的“State”值是否在状态列表“statelist”中。然后检查分配给“Measure”变量的“Measure”值是否在度量值列表“measurelist”中。如果第一次检查失败,则应生成“无效状态”错误消息。如果第二次检查失败,则应生成“无效测量”错误消息。如果两个检查都通过,我希望函数最低尝试以下操作: lowestV2 <- function(State,Measure){ ## if(State
lowestV2 <- function(State,Measure){
##
if(State %in% c(state.abb,"DC","GU","MP","PR","VI")){
if(Measure %in% c("MSAT","GPA","VSAT")){
answer<-subset(data,subset=(state==State & measure==Measure))
order.answer<-order(answer$score,answer$school)
answer1<-as.matrix(answer[order.answer,])
answer1[1,1]
} else {
stop("invalid measure")
}
} else {
stop("invalid state")
}
##
}
##
> lowestV2("NY","MSAT")
[1] "Oswego"
lowestV2我相信这个函数可以实现您想要的:
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)
lowest <- function(State, Measure,Statelist,Measurelist,Data){
if (!State%in%Statelist){
stop("invalid state")
}
if (! Measure%in%Measurelist){
stop("invalid measure")
}
else{
answer<-subset(data,subset=(state==State & measure==Measure))
order.answer<-order(answer$score,answer$school)
answer1<-as.matrix(answer[order.answer,])
print(answer1[1,1])
}
}
lowest("NY","MSAT",state,measure,data)
school参数检查可以使用checkmate
包(从)完成
加载数据:
school <- c("NYU", "BYU", "USC", "FIT", "Oswego","UCLA","USF","Columbia")
stateList <- c("NY","UT","CA","NY","NY","CA", "CA","NY")
measureList <- 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, stateList, measureList, score)
那些加号是从哪里来的?它们通常是R的继续提示,这意味着您没有关闭一个括号或一个“并且R想要更多。只是出于安全考虑,是否想过使用stopifnot()
?我得到了一个不同的错误,因为您的“最低”函数中有“State”,但您构造的数据帧有“State”“小写,R区分大小写。如果你解决了这个问题(并将“Measure”改为“Measure”),那么我就得到了“Oswego”。
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")
+ lowest("NY","MSAT")
+
lowestV2 <- function(State,Measure){
##
if(State %in% c(state.abb,"DC","GU","MP","PR","VI")){
if(Measure %in% c("MSAT","GPA","VSAT")){
answer<-subset(data,subset=(state==State & measure==Measure))
order.answer<-order(answer$score,answer$school)
answer1<-as.matrix(answer[order.answer,])
answer1[1,1]
} else {
stop("invalid measure")
}
} else {
stop("invalid state")
}
##
}
##
> lowestV2("NY","MSAT")
[1] "Oswego"
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)
lowest <- function(State, Measure,Statelist,Measurelist,Data){
if (!State%in%Statelist){
stop("invalid state")
}
if (! Measure%in%Measurelist){
stop("invalid measure")
}
else{
answer<-subset(data,subset=(state==State & measure==Measure))
order.answer<-order(answer$score,answer$school)
answer1<-as.matrix(answer[order.answer,])
print(answer1[1,1])
}
}
lowest("NY","MSAT",state,measure,data)
school <- c("NYU", "BYU", "USC", "FIT", "Oswego","UCLA","USF","Columbia")
stateList <- c("NY","UT","CA","NY","NY","CA", "CA","NY")
measureList <- 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, stateList, measureList, score)
library(checkmate)
lowest <- function (State, Measure) {
expect_subset(State, stateList, empty.ok=FALSE, info="invalid state")
expect_subset(Measure, measureList, empty.ok=FALSE, info="invalid measure")
# if you also want to restrict to single states and measures
assert_atomic(State, len=1)
assert_atomic(Measure, len=1)
answer<-subset(data,subset=(stateList==State & measureList==Measure))
order.answer<-order(answer$score,answer$school)
answer1<-as.matrix(answer[order.answer,])
answer1[1,1]
}
lowest("NY","MSAT")
# [1] "Oswego"
lowest("NJ","MSAT")
# Error with message 'invalid state'
lowest("NY","blah")
# Error with message 'invalid measure'