CodePudding user response:
When you use match, you need to either (a) give it every possible distinct value, or (b) know that a returned NA is inherently what you want/need.
In the use of
arrange(match(WeekP, weekdays(input$daterange1)))
it is matching the values of several values again the values of just two things. You aren't telling it to sort based on a full sequence of things, you are telling R "please sort this vector of things based on two strings". You are assuming that R will infer what those two strings are, and how to project that inference onto the rest of your data.
In this case, since weekdays(input$..) only includes two days of the week, everything else in your match(.) will be NA, which is obviously broken. Had you further debugged your code and looked at the output of just match(.., weekdays(..)) (assign to some column), you would see
left_join(meanTest, wk_port2eng, by = c("Week" = "WeekE")) %>%
select(-WeekP) %>%
mutate(sortcol = match(Week, weekdays(input$daterange1)))
# # A tibble: 7 x 4
# Week Category mean sortcol
# <chr> <chr> <dbl> <int>
# 1 Friday FDE 3 NA
# 2 Monday FDE 4 NA
# 3 Saturday FDE 3 2
# 4 Sunday FDE 4 1
# 5 Thursday FDE 2 NA
# 6 Tuesday FDE 6 NA
# 7 Wednesday FDE 3 NA
for which arrange will not magically infer your needs.
Use seq on your input range.
left_join(meanTest, wk_port2eng, by = c("Week" = "WeekE")) %>%
select(-WeekP) %>%
mutate(sortcol = match(Week, unique(weekdays(seq(input$daterange1[1], input$daterange1[2], by = "day")))))
# # A tibble: 7 x 4
# Week Category mean sortcol
# <chr> <chr> <dbl> <int>
# 1 Friday FDE 3 6
# 2 Monday FDE 4 2
# 3 Saturday FDE 3 7
# 4 Sunday FDE 4 1
# 5 Thursday FDE 2 5
# 6 Tuesday FDE 6 3
# 7 Wednesday FDE 3 4
So that one reactive block should be:
data_subset <- reactive({
req(input$daterange1)
req(input$daterange1[1] <= input$daterange1[2])
days <- seq(input$daterange1[1], input$daterange1[2], by = 'day')
Test1 <- dplyr::filter(data(), date1 %in% days)
weeks_inp <- unique(weekdays(days))
# wk <- wk_port2eng[wk_port2eng$WeekP %in% weeks_inp,] ### if weekday is in Portuguese in your notebook
wk <- wk_port2eng[wk_port2eng$WeekE %in% weeks_inp,] ### if weekday is in English in your notebook
weeks_ine <- wk$WeekE
meanTest1 <- data() %>%
group_by(Week = tools::toTitleCase(Week), Category) %>%
summarise(mean = mean(time, na.rm = TRUE), .groups = 'drop')
meanTest <- meanTest1[meanTest1$Week %in% as.character(weeks_ine),]
left_join(meanTest, wk_port2eng, by = c("Week" = "WeekE")) %>%
select(-WeekP) %>%
arrange(match(Week, unique(weekdays(seq(input$daterange1[1], input$daterange1[2], by = "day")))))
})
Producing:
BTW, this works fine as long as you are always summarizing by day-of-week, in which case weekdays(.) should always return a unique vector.


