У меня есть сложная процедура построения графиков, которая генерирует коробчатые графики с дополнительными слоями разброса и добавляет их в список графиков. print(current_plot_complete)
.
Однако, если они добавляются в список графиков в течение l oop, которое печатается только в конце, то графики неверны: конечные индексы используются для генерации все графики (вместо текущего индекса на момент создания графика). Похоже, это поведение по умолчанию ggplot2
, и я ищу решение, чтобы обойти его в текущем варианте использования.
Проблема, похоже, находится в пределах y = eval(parse(text=(paste0(COL_i))))
, где используется глобальная среда (и, следовательно, конечное значение индекса) вместо текущих значений на момент выполнения l oop.
Я пробовал различные подходы, чтобы eval () использовать правильные значения переменных, например local(…)
или указав среду, но безуспешно.
Очень упрощенный MWE приведено ниже.
![enter image description here](https://i.stack.imgur.com/0a05U.png)
MWE
Исходная процедура намного сложнее, чем этот MWE, так что for
l oop не может быть легко заменен членами семейства apply
.
# create some random data
data_temp <- data.frame(
"a" = sample(x = 1:100, size = 50),
"b" = rnorm(n = 50, mean = 45, sd = 1),
"c" = sample(x = 20:70, size = 50),
"d" = rnorm(n = 50, mean = 40, sd = 15),
"e" = rnorm(n = 50, mean = 50, sd = 10),
"f" = rnorm(n = 50, mean = 45, sd = 1),
"g" = sample(x = 20:70, size = 50)
)
COLs_current <- c("a", "b", "c", "d", "e") # define COLs of data to include in box plots
choice_COLs <- c("a", "d") # define COLs of data to add scatter to
plot_list <- list(NA)
plot_index <- 1
for (COL_i in choice_COLs) {
COL_i_index <- which(COL_i == COLs_current)
# Generate "basis boxplot" (to plot scatterplot on top)
boxplot_scores <- data_temp %>%
gather(COL, score, all_of(COLs_current)) %>%
ggplot(aes(x = COL, y = score)) +
geom_boxplot()
# Get relevant data of COL_i for scattering: data of 4th quartile
quartile_values <- quantile(data_temp[[COL_i]])
threshold <- quartile_values["75%"] # threshold = 3. quartile value
data_temp_filtered <- data_temp %>%
filter(data_temp[[COL_i]] > threshold) %>% # filter the data of the 4th quartile
dplyr::select(COLs_current)
# Create layer of scatter for 4th quartile of COL_i
scatter_COL_i <- geom_point(data=data_temp_filtered, mapping = aes(x = COL_i_index, y = eval(parse(text=(paste0(COL_i))))), color= "orange")
# add geom objects to create final plot for COL_i
current_plot_complete <- boxplot_scores + scatter_COL_i
print(current_plot_complete)
plot_list[[plot_index]] <- current_plot_complete
plot_index <- plot_index + 1
}
plot_list