У меня есть функции шаблонного графика, которые проверяют, имеет ли фрейм данных> 0 строк перед запуском:
library(tidyverse)
plot_fun <- function(df) {
if (nrow(df) > 0) {
df %>%
ggplot(., aes(Sepal.Length, Sepal.Width)) +
geom_point()
}
}
Затем я использую это в каналах и добавляю сделанные на заказ слои:
iris %>% plot_fun() + ggtitle("Plot me")
Однако, если данные в кадре имеют 0 строк, я получаю сообщение об ошибке, потому что я пытаюсь добавить слои ни к чему:
iris %>%
filter(Sepal.Length > 1000) %>%
plot_fun() +
ggtitle("Plot me")
Ошибка в ирисе%>% filter (Sepal.Length> 1000)%>% plot_fun () + ggtitle ("Plot me"): не числовой c аргумент бинарного оператора
I может построить чек в середине канала, чтобы избежать ошибки:
iris %>%
filter(Sepal.Length > 1000) %>%
plot_fun() %>%
{
if (!is.null(.)) {
. +
ggtitle("Plot me")
}
}
Это работает, но кажется неуклюжим. Можно ли сделать функцию check_df_pipe()
или что-то, чтобы остановить канал, если предыдущие фильтры удаляют все данные? Или, может быть, проверить, является ли канал .
NULL
в точке?
check_df_pipe <- function(x) {
if(nrow(x) > 0) {
x
} else{
stop("Dont return an error just to exit pipe")
}
}
iris %>%
filter(Sepal.Length > 1000) %>%
check_df_pipe() %>%
plot_fun() +
ggtitle("Plot me")
Ошибка в check_df_pipe (.): Не возвращать ошибку только для выхода из трубы
Или есть другие идеи о том, как с этим бороться? Я не хочу добавлять ggtitle("Plot me")
в plot_fun
, потому что я не хочу plot_fun
оставаться универсальным c.