Целью этого скрипта было воспроизвести что-то вроде рисунка ниже:
найдено на: https://robjhyndman.com/hyndsight/tscv/
Проблема, с которой я столкнулся, связана (я думаю) с тем, как R обрабатывает мои обещания в ggplot.
Ниже приведен пример, который воспроизводит мою проблему.
library(tidyverse)
process_starting_row <- 600
per_validation_period <- 30
number_of_validations <- 5
graphical_data <- data.frame(x= 1:(process_starting_row + 1 + (number_of_validations)*per_validation_period))
for (it in 1:number_of_validations) {
# For this graph there is always a line and then a colour component explaining each one...
graphical_data[,paste0("iteration",it,"line")] <- c(it)
# First make the whole row grey and then "dolly up" the colours.
graphical_data[,paste0("iteration",it,"colour")] <- "grey"
graphical_data[1:(process_starting_row + (it-1)*per_validation_period), paste0("iteration",it,"colour")] <- "blue"
graphical_data[(process_starting_row + 1 + (it)*per_validation_period), paste0("iteration",it,"colour")] <- "red"
}
#graphical_data
Приведенный выше код создает объект dataframe, который можно использовать для создания нужной фигуры. Для каждой итерации (на исходном рисунке отдельная линия) создается вектор, соответствующий итерации "высота" над осью (имя столбца всегда iteration#line
и соответствующий символьный вектор iteration#colour
, с цветным кодом для каждая из точек.
Следующий бит - создание базового объекта ggplot.
ggbase <- ggplot(data = graphical_data, aes(x=x)) +
coord_cartesian(xlim = c(process_starting_row-1*per_validation_period, nrow(graphical_data))) +
theme_bw()
Именно на этом базовом объекте я хочу повторить.
Я написал функцию, которая будет добавлять каждую итерацию gg_adding()
, а затем еще одну ggaddfor()
, которая запускает цикл for.
gg_adding <- function(data, iteration_sub, color_sub){
iteration_promise <- enquo(iteration_sub)
colour_promise <- enquo(color_sub)
gg <- geom_point(data = data, aes(x= x, y= !! iteration_promise, color = !! colour_promise))
return(gg)
}
ggaddfor <- function(data, gg){
ggout <- gg
for (it in 1:number_of_validations) {
#print(it)
iterationsub <- paste0("iteration",it,"line")
coloursub <- paste0("iteration",it,"colour")
ggout <- ggout + gg_adding(data, iterationsub, coloursub)
}
return(ggout)
}
Когда я запускаю эту функцию, я получаю следующее:
# Not working
ggaddfor(graphical_data, ggbase)
, который производит вывод, который выглядит следующим образом:
Очевидно, это не то, на что я надеялся ...
Для того, чтобы проверить вещи, я оговорил каждую итерацию в явном виде.
# Working...
ggadd <- ggbase
ggadd <- ggadd + gg_adding(graphical_data, iteration1line, iteration1colour)
ggadd <- ggadd + gg_adding(graphical_data, iteration2line, iteration2colour)
ggadd <- ggadd + gg_adding(graphical_data, iteration3line, iteration3colour)
ggadd <- ggadd + gg_adding(graphical_data, iteration4line, iteration4colour)
ggadd <- ggadd + gg_adding(graphical_data, iteration5line, iteration5colour)
Это дает желаемый результат:
Я хочу поместить эти функции в пакет, который я сейчас пишу, и поэтому явное указание дополнений (как я делаю прямо выше) не сработает ...
Я не уверен, почему мой предыдущий код не дает таких же результатов. Я немного новичок в обработке обещаний с помощью пакета rlang, и я подозреваю, что моя ошибка могла быть там ...