【问题标题】:Unused argument error in nested ifelse statements嵌套 ifelse 语句中未使用的参数错误
【发布时间】:2012-11-09 07:22:05
【问题描述】:

我正在制作一个输出星期几的函数,给定自 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

我无法弄清楚如何绕过它 - 看起来它只是忽略了 ifelse 语句的 then 部分。我尝试向它提供各种样本数据集或数据点,但无法修复错误。

这是我的代码 - 在此先感谢。

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

【问题讨论】:

  • 看到这个了吗? Find the day of a week in R。将您的天数值转换为可以输入weekdays 的真实日期值应该很简单。一般来说,如果有一个基本函数可以满足你的需要,那么它可能比你或我写的要仔细得多。
  • 当他们在 thedailywtf 一遍又一遍地写作时,如果你想执行一些显而易见的任务,可以肯定其他人已经这样做了。因此,在常见的 R 包中搜索日期/时间函数相对容易:-)

标签: r if-statement


【解决方案1】:

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 会将 day="..." 部分解释为您将 命名参数 day 传递给函数。
此外,一般来说,您应该避免使用= [大部分时间],您可能的意思是使用&lt;-
无论如何,纠正了 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")
               )
             )
           )
         )
       )

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      dayFinder <- function(x) weekdays(as.Date("1970/1/1") + x)
      dayFinder(21)
      # [1] "Thursday"
      dayFinder(c(21, 101))
      # [1] "Thursday" "Sunday"  
      

      【讨论】:

        猜你喜欢
        • 2021-03-03
        • 2013-08-03
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-23
        • 2021-09-26
        • 1970-01-01
        相关资源
        最近更新 更多