嵌套ifelse语句中未使用的参数错误

时间:2012-11-09 07:22:05

标签: r if-statement

我正在制作一个输出星期几的函数,给出自1970年1月1日以来的一些天。当函数是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 个答案:

答案 0 :(得分:9)

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"


现在......关于ifelseunused argument error ...的使用情况 首先,请记住 ifelse ()是一个函数,因此当你写一个像... ifelse(rem == 0, day="Thursday, ...这样的语句时,R会解释{{1部分好像是将 命名参数 day="..."传递给函数。
此外,一般情况下,您应该避免使用day [大部分时间],您可能意味着使用=
无论如何,纠正ifelse链应该看起来像'喜欢

<-

答案 1 :(得分:3)

有一种比使用嵌套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"
    )

答案 2 :(得分:2)

dayFinder <- function(x) weekdays(as.Date("1970/1/1") + x)
dayFinder(21)
# [1] "Thursday"
dayFinder(c(21, 101))
# [1] "Thursday" "Sunday"