Условное окрашивание с kableExtra () завершается неудачно с NA в столбце - PullRequest
0 голосов
/ 04 февраля 2019

Я использую kableExtra () - пакет для условного форматирования таблиц в отчете Rmarkdown PDF-вывода.Все работает довольно хорошо, но не работает, если в одном столбце присутствует NA.

Исходный отчет содержит столбцы с процентным соглашением по определенной переменной (например, 21% (но% не в ячейке)), однакоон покажет NA, если значение основано на менее чем 10 ответах для защиты ответов субъектов, поэтому у меня будут потенциальные NA в таблице.

Вот небольшой пример для случая, когда это работает (нет NA):

---
output: pdf_document
---

```{r setup}
knitr::opts_chunk$set(echo = TRUE)
# load packages
library(tidyverse)
library(kableExtra)


# example when no NA are resent
df1 <- mtcars %>% select(mpg, cyl, disp)
df1 <- head(df1, 10)
# kable
df1 %>%
  mutate(cyl = cell_spec(cyl, color = if_else(cyl == 8, "teal",
                                              if_else(cyl == 6, "orange", 
                                                      if_else(is.na(cyl), "black", "red"))))) %>%
    kable("latex", escape = F, booktabs = TRUE, linesep = "")

```

вот другой, когда есть NA:

```{r, eval=T}
# example when NA is present
df2 <- mtcars %>% select(mpg, cyl, disp)
df2 <- head(df2, 10)
df2$cyl[df2$cyl == 4] <- NA

# kable
df2 %>%
  mutate(cyl = cell_spec(cyl, color = if_else(cyl == 8, "teal",
                                              if_else(cyl == 6, "orange", "red")))) %>%
    kable("latex", escape = F, booktabs = TRUE, linesep = "")


```

ошибка при запуске чанка:

Error in if (substr(color, 1, 1) != "#") { : missing value where 
TRUE/FALSE needed

ошибка, когдаВязание:

enter image description here

Я также попытался добавить третий if_else (), который оценивает is.na () - ошибки остаются прежними:

# kable
df2 %>%
  mutate(cyl = cell_spec(cyl, color = if_else(cyl == 8, "teal",
                                              if_else(cyl == 6, "orange", 
                                                      if_else(is.na(cyl), "black","red"))))) %>%
    kable("latex", escape = F, booktabs = TRUE, linesep = "")

Мой session.info:

R version 3.5.2 (2018-12-20)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Mojave 10.14.2

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] naniar_0.4.1       shurp2018_0.0.9000 kableExtra_1.0.1   forcats_0.3.0      stringr_1.3.1      dplyr_0.8.0        purrr_0.3.0       
 [8] readr_1.3.1        tidyr_0.8.2        tibble_2.0.99.9000 ggplot2_3.1.0      tidyverse_1.2.1 

1 Ответ

0 голосов
/ 04 февраля 2019

Кажется, что у вас есть две проблемы:

Во-первых, я думаю, что по умолчанию значение цвета не установлено.Тем не менее, это также не переписывается, когда для некоторых ячеек color = NA.Таким образом, вы можете решить эту проблему, установив color = NULL (любой другой цвет будет объединен с теми, которые назначены на следующем шаге, что вызывает проблемы). Так что это работает для меня несколько:

```{r}
# kable
df2 %>%
  mutate(cyl = cell_spec(cyl, color = NULL)) %>% 
  mutate(cyl = cell_spec(cyl, color = if_else(cyl == 8, "teal",
                                              if_else(cyl == 6, "orange", "red")))) %>%
    kable("latex", escape = F, booktabs = TRUE, linesep = "")
```

Проблема в том,что цвет NA теперь красный, а не черный.

Вторая проблема в том, что ваши ifelse оценки не работают правильно

Вы также можете проверить, что происходит в вашем ifelse Функция работает отдельно, чтобы лучше понять эту проблему:

> with(df2,  if_else(cyl == 8, "teal",
+                    if_else(cyl == 6, "orange", 
+                            if_else(is.na(cyl), "black","red"))))
 [1] "orange" "orange" NA       "orange" "teal"   "orange" "teal"   NA       NA       "orange"

Но вы можете заставить ее работать, оценив сначала is.na(cyl) вместо последнего:

df2 %>%
  mutate(cyl = cell_spec(cyl, color = if_else(is.na(cyl), "black", 
                                              if_else(cyl == 8, "teal",
                                                      if_else(cyl == 6, "orange", "red"))))) %>%
  kable("latex", escape = F, booktabs = TRUE, linesep = "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...