У меня есть сценарии R Markdown, которые я периодически запускаю и которые содержат условные таблицы с тем, что я буду называть нарушителями. Вот пример фрейма данных:
df <- data.frame(Person = c("Jack", "Jill"), Violator = c("F", "F"))
#> Person Violator
#> 1 Jack F
#> 2 Jill F
Я хочу показать только нарушителей (Violator == "T"), а в этом месяце их нет. Итак, мой «обычный» код кабеля ниже дает мне эту ошибку, "индекс за пределами", которую я ожидал.
Как я могу изменить свой код kable, чтобы он «ничего не делал», если нарушитель не равен «T». ifelse()
путь? Я открыт для kableExtra()
решений.
kable(df %>% filter(Violator == "T"), "html", align = "l") %>%
kable_styling("striped", "hover", full_width = F) %>%
column_spec(1, bold = T, background = "#FFFFFF") %>%
collapse_rows(columns = 1)
@ Андрей Только что попробовал, но получаю ту же ошибку "индекс за пределами". Я не думаю, что kable()
может напечатать таблицу размера 0, если только я вас не понял. df %>% filter(Violator == "T")
вернет таблицу с 0 строками.
сделайте df1 <- df %>% filter(Violator == "T")
, затем проверьте условие if (nrow(df1) > 0)
и примените kable
к df1
.
Извините - неправильно прочитал ваш вопрос!!!
Этот простой подход должен работать, я думаю:
```{r}
temp <- df %>% filter(Violator == "T")
if (nrow(temp) != 0){
kable(temp, "html", align = "l") %>%
kable_styling("striped", "hover", full_width = F) %>%
column_spec(1, bold = T, background = "#FFFFFF") %>%
collapse_rows(columns = 1)
}
```
Вместо создания дополнительного объекта вы можете использовать any(df$Violator == TRUE)
#PoGibas: Из вопроса df$Violator
содержит строковые значения "T"
или "F"
. Ваш тест any(df$Violator == TRUE)
всегда будет возвращать FALSE
, потому что TRUE
будет преобразован в строковое значение "TRUE"
для сравнения.
Попробуйте отфильтровать свой фрейм данных, прежде чем передавать его в
kable
. Например,df %>% filter(Violator == "T") %>% kable("html", align = "l") %>% etc.