Я создаю параметризованный отчет в Rmarkdown, в то время как некоторые фрагменты не должны оцениваться (включаться в отчет) на основе характеристик содержимого внутри фрагмента.
В отчете вычисляются отдельные сводки по крупному опросу для ~ 120 объектов с различным количеством единиц в них.Кроме того, размер и объем единиц в значительной степени варьируются, поэтому мы исключаем анализ единиц, если число допустимых ответов на единицу меньше 10 (это уже перекодировано в NA в объекте dataframe).Поэтому мне нужно написать инструкцию, в которой подсчитывается количество NA в объекте на единицу, и если для каждой единицы есть только NA, я хотел бы включить include = FALSE в чанке.Это нужно повторить для ~ 50 кусков, поэтому я попытался использовать eval.after.
Комментарий Мартина Шмельцера заставил меня понять, что у меня есть 2 разные проблемы:
1) Мне нужно использоватьрегулярные выражения для определения имени объекта в самописанной функции в чанке.
2) Мне нужно настроить функцию для условной оценки eval.after в чанках.
Для задачи 1): R-Chunk, который необходимо проверить на наличие eval.after, выглядит следующим образом:
```{r leadership unit, eval=exclude_ifnot_unitC }
kable.unit.tblc(unitblc_leadership, caption = "Führung")
```
kable.unit.tblc(df, caption)
- это функция, написанная самостоятельно и реализующая функции kableExtra () для стилизации таблиц.и первый вход является фреймом данных (который был предварительно создан в R-файле).Теперь я должен использовать регулярное выражение для извлечения имени блока данных из фрагмента, что означает все от kable.unit.tblc(
до , caption
.
Я пробовал это до сих пор для первых шагов в регулярных выражениях, но я не могу получить объект "между" этими двумя выражениями:
x <- 'kable.unit.tblc(unitblc_leadership, caption = "Führung")'
stringr::str_extract(x, "^kable.unit.tblc\\(")
stringr::str_extract(x, ", caption")
Желаемый результатв этом случае извлеченный объект будет unitblc_leadership
и сохранен в переменной, скажем test_object
.
Что касается второй проблемы: я должен установить eval.after = 'include_if_valid'
для этих чанков и функцию для проверки это будет:
include_if_valid <- function() {
## search the chunk with regular expression for detecting the
# test object (Problem 1)
# count the number of NAs in all numeric variables of the
# test_object and if all cells are NA's give FALSE, if any
# cell has a value give TRUE
test_object %>%
select_if(is.numeric) %>%
summarise_all(.funs = list(~n.valid)) %>%
gather(key = "Unit", value = "nvalid") %>%
count(nvalid > 0) %>% pull(`nvalid > 0`)
Как вы можете видеть, мне нужно test_object
, которое должно быть получено с помощью функции раньше - но я не уверен, что мое намерение вообще возможно.
Чанкдолжен выглядеть примерно так:
```{r leadership unit, eval.after=include_if_valid }
kable.unit.tblc(unitblc_leadership, caption = "Führung")
```
Редактировать: мне показалось слишком сложным - это решение Мартина сработало просто отлично:
include_if_valid <- function(df) {
if (df %>%
select_if(is.numeric) %>%
summarise_all(.funs = list(~n.valid)) %>%
gather(key = "Unit", value = "nvalid") %>%
pull() %>% sum() > 0) {TRUE} else {FALSE}
}
и внутри куска:
{r leadership unit, eval=include_if_valid(unitblc_leadership) }
kable.unit.tblc(unitblc_leadership, caption = "Führung")