Ошибка неиспользованного аргумента во вложенных операторах 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"  
Другие вопросы по тегам