Мне нужно написать функцию, которая будет подсчитывать количество рабочих дней (минус выходные и вектор других местных банковских праздников), но проблема, с которой я сталкиваюсь, более просто иллюстрируется простым подсчетом числаweekdays.
Вот функция, которая будет давать количество дней недели между двумя датами:
removeWeekends <- function(end, start){
range <- as.Date(start:end, "1970-01-01")
range<- range[sapply(range, function(x){
if(!chron::is.weekend(x)){
return(TRUE)
}else{
return(FALSE)
}
})]
return(NROW(range))
}
, которая работает, когда ей присваивается одна дата для каждого аргумента:
removeWeekends(as.Date("2018-05-08"), as.Date("2018-06-08"))
#[1] 24
Но когда ему дается два вектора из фрейма данных, происходит сбой:
one <- as.Date("2017-01-01"):as.Date("2017-01-08")
two <- as.Date("2018-06-08"):as.Date("2018-06-15")
df <- data.frame(one, two)
removeWeekends(df$two, df$one)
#[1] 375
#Warning messages:
#1: In start:end : numerical expression has 8 elements: only the first used
#2: In start:end : numerical expression has 8 elements: only the first used
Я также попробовал (что, как я догадался, не сработает, так как синтаксис кажется отключенным):
lapply(df, removeWeekends, df$two, df$one)
#Error in FUN(X[[i]], ...) : unused argument (17167:17174)
И:
lapply(df[,c("two", "one")], removeWeekends)
#Error in as.Date(start:end, "1970-01-01") : argument "start" is missing,
# with no default
Я предполагаю, что я неправильно понимаю концепцию векторизации.
Единственная другая идея, которая у меня есть, - это вложение функции вусловно, чтобы видеть, является ли это вектором, затем вызывать функцию применения к нему, если это так, хотя я не совсем уверен, как бы я это структурировал.