R 在执行函数之前验证参数

R 在执行函数之前验证参数,r,function,validation,arguments,R,Function,Validation,Arguments,我想验证传递给函数的两个参数是否都有效 为此,我要检查分配给“State”变量的“State”值是否在状态列表“statelist”中。然后检查分配给“Measure”变量的“Measure”值是否在度量值列表“measurelist”中。如果第一次检查失败,则应生成“无效状态”错误消息。如果第二次检查失败,则应生成“无效测量”错误消息。如果两个检查都通过,我希望函数最低尝试以下操作: lowestV2 <- function(State,Measure){ ## if(State

我想验证传递给函数的两个参数是否都有效

为此,我要检查分配给“State”变量的“State”值是否在状态列表“statelist”中。然后检查分配给“Measure”变量的“Measure”值是否在度量值列表“measurelist”中。如果第一次检查失败,则应生成“无效状态”错误消息。如果第二次检查失败,则应生成“无效测量”错误消息。如果两个检查都通过,我希望函数最低尝试以下操作:

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'