#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:
Вам необходимо использовать векторизованные функции для работы с несколькими значениями.
Вот несколько вариантов.
- Вложенный
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"
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))
cut
что является масштабируемым.
grads<- function(x) {
cut(x, c(0, 50, 70, 80, 100), c("Fail", "Good", "Very Good", "Excellent"))
}
grads(c(95,60,77,33))