создайте определяемую пользователем функцию в R со списком не только одних входов

#r #function

Вопрос:

Я хочу создать функции, которые я могу протестировать с помощью нескольких входов, таких как список чисел, приведенный ниже, — это мой код. Я хочу не только протестировать несколько входных данных, но и не знаю, как сделать то же самое в аргументе функции.

 grads<-function((for (X in 0:100)))
  
if (x<=50){
  "Fail"
}else if (x<=70){
  "Good"
  
}else if (x<=80){
  "V Good"
} else {
  "Execellent"
}

grads(95,60,77,33)
 

это ошибка, которую я получил

 Error in grads(95, 60, 77, 33) : unused arguments (60, 77, 33)
 

Ответ №1:

Мы можем использовать fcase от data.table

 library(data.table)
grads <- function(x) {
     data.table::fcase(x <= 50, "Fail",
                       x <= 70, "Good",
                       x <= 80, "Very Good",
                       default = "Excellent")
}
 

-тестирование

 grads(c(95,60,77,33))
[1] "Excellent" "Good"      "Very Good" "Fail"  
 

Или используя findInterval из base R

 grads <- function(x)  {
      c("Fail", "Good", "Very Good", "Excellent")[findInterval(x,
       c(0, 50, 70, 80, 100))]
}
grads(c(95,60,77,33))
[1] "Excellent" "Good"      "Very Good" "Fail"    
 

Ответ №2:

Вам необходимо использовать векторизованные функции для работы с несколькими значениями.

Вот несколько вариантов.

  1. Вложенный ifelse .
 grads<- function(x) {
  ifelse(x <= 50, "Fail", 
         ifelse(x <= 70, "Good", 
                ifelse(x <= 80, "Very Good", "Excellent")))
}

grads(c(95,60,77,33))
#[1] "Excellent" "Good"      "Very Good" "Fail" 
 
  1. case_when из dplyr которого более читаемо для вложенных условий
 grads<- function(x) {
  dplyr::case_when(x <= 50 ~ "Fail", 
                   x <= 70 ~ "Good", 
                   x <= 80 ~ "Very Good",
                   TRUE ~ "Excellent")
}
grads(c(95,60,77,33))
 
  1. cut что является масштабируемым.
 grads<- function(x) {
  cut(x, c(0, 50, 70, 80, 100), c("Fail", "Good", "Very Good", "Excellent"))
}
grads(c(95,60,77,33))