【问题标题】:Is there a R function to find the next position of an element in a list是否有一个 R 函数来查找列表中元素的下一个位置
【发布时间】:2021-09-21 11:16:15
【问题描述】:

我想创建一个第二天返回的函数

这是我得到的:

next_day <- function(day){
 + week = list('monday','tuesday','wednesday','thursday','friday','saturday','sunday')
 + pos <- index(day, week)
 + if(day=='sunday') return('monday')
 + if match(day,week) return week[pos+1]

Error: unexpected symbol in:
"   + if(day=='sunday') return('monday')
    + if match"

【问题讨论】:

  • 存在很多语法问题:在最后一个ifreturn 之后缺少圆括号,然后缺少函数的右大括号。

标签: r weekday


【解决方案1】:
nextday <- function(day){
  week <- list('monday','tuesday','wednesday','thursday','friday','saturday','sunday')
  day <- stringr::str_to_lower(day)
  index <- match(day, week)
  if(index == 7){
    index = 0
  }
  week[[index+1]]
}

nextday("sunday")

输出:

[1] "monday"

【讨论】:

  • 不客气。如果函数内部的索引等于NA,则可以添加消息错误(这意味着用户没有提供正确的日期格式)
【解决方案2】:

这是解决问题的另一种方法。

next_day <- function(day) {
  days <- c(sunday='monday', monday='tuesday', tuesday='wednesday', 
            wednesday='thursday', thursday='friday', friday='saturday', 
            saturday='sunday')
  unname(days[tolower(day)])
}




# find next day for a single day
next_day("sunday")
[1] "monday"

# find next days for many days
next_day(c("sunday", "monday", "friday"))
[1] "monday"   "tuesday"  "saturday"

【讨论】:

    【解决方案3】:

    使用%%

    next_day <- function(day){
      week = c('monday','tuesday','wednesday','thursday','friday','saturday','sunday')
      week[ (match(day, week) %% 7) + 1 ]
    }
    
    #testing
    next_day("tuesday")
    # [1] "wednesday"
    
    next_day("sunday")
    # [1] "monday"
    

    【讨论】:

      【解决方案4】:

      我会使用一个闭包,这样就不需要在每次调用函数时都创建天向量。

      next_day <- (function(week) {
        function(day) {
          week[1 + match(day, week)]
        }
      })(weekdays(seq(as.Date("2000-1-1"), by=1, length.out = 8)))
      
      
      next_day("Sunday")
      #[1] "Monday"
      
      next_day(c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))
      #[1] "Tuesday"   "Wednesday" "Thursday"  "Friday"    "Saturday"  "Sunday"    "Monday"   
      

      matchtolowertoupper期间加用大写/小写问题。

      【讨论】:

        猜你喜欢
        • 2021-08-05
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        • 2020-07-07
        • 2021-06-07
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        相关资源
        最近更新 更多