Ошибка неиспользованного аргумента во вложенных операторах ifelse
Я делаю функцию, которая выводит день недели, учитывая количество дней с 01.01.1970. Функция работала нормально, когда это была цепочка if then
заявления, но я хочу использовать функцию на векторах, поэтому мне нужно построить эту глупо выглядящую цепочку ifelse
заявления.
К сожалению, я продолжаю получать эту ошибку:
Error in ifelse(rem == 0, day = "Thursday", ifelse(rem == 1, day = "Friday", :
unused argument(s) (day = "Thursday")
Calls: dayFinder -> ifelse
Execution halted
Я не смог выяснить, как обойти это - похоже, это просто игнорирование then
часть ifelse
заявление. Я попытался подать на него различные наборы данных или точки данных и не смог исправить ошибку.
Вот мой код - заранее спасибо.
dayFinder <- function(x){
#Assuming that '0' refers to January 1 1970
#Store given number
start <- x
#Initialize variable
day="Halloween"
#Divide x by 7 and store remainder
rem <- x%%7
#Determine the day
ifelse(rem==0, day="Thursday",
ifelse (rem==1, day="Friday",
ifelse (rem==2, day="Saturday",
ifelse (rem==3, day="Sunday",
ifelse (rem==4, day="Monday",
ifelse(rem==5, day="Tuesday",
if (rem==6)
{
day="Wednesday"
}))))))
return(day)
}
q = seq(7,50,1)
z = dayFinder(q)
z
3 ответа
Есть несколько вещей, которые не так с ifelse
цепочка, но я хотел бы сначала упомянуть способ написания такого рода селекторов в более удобочитаемой форме.
days.of.week <- c("Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday")
x <- 21 # some value
day <- days.of.week[(x%%7) + 1]
day
[1] "Thursday"
Теперь... об использовании ifelse
и unused argument error
...
Во-первых, помните, что ifelse() является функцией, поэтому, когда вы пишете ... ifelse(rem == 0, day="Thursday, ...
R будет интерпретировать day="..."
расстаться, как если бы вы передавали именованный аргумент day
к функции.
Кроме того, в общем, вы должны избегать использования =
[большую часть времени], вы, вероятно, хотите использовать <-
,
Во всяком случае, исправлено, если цепочка ifelse должна выглядеть примерно так
rem <- 21%%7
day <- ifelse(rem==0, "Thursday",
ifelse (rem==1, "Friday",
ifelse (rem==2, "Saturday",
ifelse (rem==3, "Sunday",
ifelse (rem==4, "Monday",
ifelse(rem==5, "Tuesday", "Wednesday")
)
)
)
)
)
Существует намного лучший способ условного перекодирования, чем использование вложенных операторов if else. Используйте dplyr:: case_when. Это изменит вашу жизнь по-настоящему. Вот как будет выглядеть код с case_when, так намного чище:
day <- case_when(
rem==0 ~ "Thursday",
rem==1 ~ "Friday",
rem==2 ~ "Saturday",
rem==3 ~ "Sunday",
rem==4 ~ "Monday",
rem==5 ~ "Tuesday",
rem==6 ~ "Wednesday"
)
dayFinder <- function(x) weekdays(as.Date("1970/1/1") + x)
dayFinder(21)
# [1] "Thursday"
dayFinder(c(21, 101))
# [1] "Thursday" "Sunday"